106

Postgres はデータベースです

IN 句に NULL 値を使用できますか? 例:

SELECT *
FROM tbl_name
WHERE id_field IN ('value1', 'value2', 'value3', NULL)

この 4 つの値に限定したいと思います。

上記のステートメントを試してみましたが、うまくいきません。実行はできますが、id_fields が NULL のレコードは追加されません。

OR条件も追加しようとしましたが、これによりクエリが実行され、終わりが見えなくなります。

SELECT *
FROM tbl_name
WHERE other_condition = bar
AND another_condition = foo
AND id_field IN ('value1', 'value2', 'value3')
OR id_field IS NULL

助言がありますか?

4

7 に答える 7

156

inステートメントは と同じように解析されますfield=val1 or field=val2 or field=val3。そこにnullを入れるfield=nullと、うまくいきません。

マークBコメント

わかりやすくするためにこれを行います

SELECT *
FROM tbl_name
WHERE 
(id_field IN ('value1', 'value2', 'value3') OR id_field IS NULL)
于 2011-06-15T18:05:31.773 に答える
26

演算子の優先順位が原因でクエリが失敗します。AND前にバインドしORます!
「明確さ」の問題ではなく、純粋な論理の必要性である括弧のペアが必要です。

SELECT *
FROM   tbl_name
WHERE  other_condition = bar
AND    another_condition = foo
AND   (id_field IN ('value1', 'value2', 'value3') OR id_field IS NULL);

追加された括弧は、のAND前のバインドを防ぎORます。他のWHERE条件がない場合(no AND)、追加の括弧は必要ありません。受け入れられた答えは、この点で誤解を招くものです。

于 2013-02-11T06:45:48.313 に答える
23
SELECT *
FROM tbl_name
WHERE coalesce(id_field,'unik_null_value') 
IN ('value1', 'value2', 'value3', 'unik_null_value')

チェックからヌルを排除するようにします。id_field に null 値が指定された場合、coalesce 関数は null の代わりに「unik_null_value」を返し、「unik_null_value」を IN リストに追加することで、クエリは id_field が value1-3 または null である投稿を返します。

于 2016-09-12T14:31:30.323 に答える
12

ダニエルが答えた質問は完全に問題ありません。NULLS についてメモを残しておきたいと思います。列に NULL 値が含まれている場合、NOT IN 演算子の使用には注意が必要です。列に NULL 値が含まれていて、NOT IN 演算子を使用している場合、出力は得られません。これは、ここで説明されている方法ですhttp://www.oraclebin.com/2013/01/beware-of-nulls.html、私が出会って共有しようと思った非常に良い記事です。

于 2013-02-11T04:56:38.490 に答える