1

私は完全なDB抽象化ライブラリを使用しておらず、psycopg2で次のような生のSQLテンプレートを使用しています:

 SELECT id FROM table WHERE message = %(message)s ;

意図した結果を取得するための理想的なクエリは次のようになります。

 SELECT id FROM table WHERE message = 'a3cbb207' ;
 SELECT id FROM table WHERE message IS NULL ;

残念ながら...明らかな問題は、私のNULL比較が次のようになることです:

 SELECT id FROM table WHERE message = NULL ;

...これは正しい比較ではなく、意図した結果セットが得られません。

私の実際のクエリは、上の図よりもはるかに複雑であるため、簡単に変更することはできません。(これが正しい解決策です。同意します。現在、緊急の修正を探しています)

誰かが回避策を知っているので、適切な修正が行われるまで同じ単一のテンプレートを使用し続けることができますか? 私は仕事をしたり、仕事をしcoalesceたりしようとcastしていましたが、私の試みで打ちのめされました.

4

3 に答える 3

11

あなたが欲しいのはですIS NOT DISTINCT FROM

SELECT id FROM table WHERE message IS NOT DISTINCT FROM 'the text';

SELECT id FROM table WHERE message IS NOT DISTINCT FROM NULL;

NULL IS NOT DISTINCT FROM NULLtrueではないNULLので、似ていますが、比較セマンティクス=が異なります。NULLトリガー機能に優れています。

ただし、 AFAIKはIS DISTINCT FROMインデックスルックアップには使用できないため、注意してください。null と値に対して別々のテストを使用することをお勧めします。

于 2012-08-18T01:52:29.257 に答える
1

残念ながら、の値はunknownを表すことを意図しているため、NULLは実際には何にも (別の にも) 等しくありません。最善の策は、テンプレートを変更してこれを正しく処理することです。NULLNULL

テンプレートの左オペランドと右オペランドに別々の値を渡すことができる場合、等号を使用する方法の 1 つは次のとおりです。

SELECT id FROM table WHERE true = (message is null);
于 2012-08-18T00:59:27.773 に答える
1

次のようにクエリ句を記述してみてください。

WHERE message = %(message)s OR ((%message)s IS NULL AND message IS NULL))

少し大雑把ですが、「自分のパラメータに一致するメッセージを選択するか、自分のパラメータが null の場合は null のメッセージをすべて選択する」という意味です。それはトリックを行う必要があります。

于 2012-08-18T01:06:41.257 に答える