3

「N/A」、「Single」、「Multiple」の 3 つの値を持つテーブルに Status 列があります。一部の行にはNULL、Status 列の値があります。

Status が null ではなく、'N/A' でもないすべての行をプルアップする必要があります。基本的に、ステータスが「Single」または「Multiple」のすべての行が必要です。

NULL が実際に「UNKNOWN」と同等であることについて読んでいます。

私が言うなら

SELECT *
FROM t_userstatus
WHERE status <> 'N/A'

結果を取得します(「単一」または「複数」のみを含むすべての行)。

私が知りたいのは、上記のWHERE句は常に NULL 値を持つ行を除外するということですか?それは期待される動作ですか?

明示的に指定していないのに、null 行が除外される原因は何ですか?

私のクエリでは、ステータスを明示的に言う必要がありますIS NOT NULLか?

私はプログラミングに比較的慣れていないので、助けていただければ幸いです。

4

5 に答える 5

6

N/ASingleMultipleも)はに関連しない文字列であるため、これは正常な動作ではありませんNULL。はNULL不明と評価されて返されない場合があります、明示的にを使用する必要がありますIS NOT NULL

SELECT [column_list] FROM t_userstatus
WHERE status IS NOT NULL AND status <> 'N/A'

また、列リストを指定する習慣を身につけることをお勧めします。

于 2013-01-07T18:38:47.067 に答える
5

SQL では、true、false、unknown の3 つの値を持つロジックが使用されます。との比較はすべて になりnullますunknown

したがってnull <> 'N/A'、 に評価されunknownます。unknownは真ではないため、行が除外されることを意味します。

于 2013-01-07T18:41:32.773 に答える
2

はい、それは正常な動作です。NULL値には値がないため、条件を満たしていませんWHEREIS NOT NULLnull値も含める場合は、同様に指定する必要があります。

于 2013-01-07T18:39:09.030 に答える
2

少しわかりにくいですが、SQL には 3 つの値を持つロジック (true/false/unknown) があります。との直接比較は、句で真でないと見なされるNULL値になります。あなたの状態;unknownWHERE

WHERE status <> 'N/A'

つまり、NULL決して「等しくない」ことはないため、null と一致することはありません。

NULL比較を使用してを一致させる唯一の方法は、特殊な null 操作IS NULLまたはを使用することIS NOT NULLです。

余談ですが、当然のことながら、人生はそれほど単純ではありません。

于 2013-01-07T18:43:14.287 に答える
2

他の人が言ったように、 null は一般的に比較できません。そのため、ステータスが null の場合、ステータス != 'N/A' は false として返されます。

しかし、他の人がまだ言及していないのは、それが Ansi_nulls 設定によって制御されるということです。デフォルトではオンになっており、ヌルは比較できません(質問で述べているように、この背後にあるプリンシパルは不明であるため、必ずしもN/Aではないというのは誤りです)。しかし、あなたは使うことができます

SET ANSI_NULLS OFF

この動作を変更するには、null は null と等しくなり、他のものとは等しくなりません。詳細については、MSDN hereを参照してください。

于 2013-01-07T18:48:50.383 に答える