2

私は以下のクエリを持っています

Select 
RPAD(x.QUOTE_ID,20,' ')
from csa_sli_all.T_CONV_XREF_CUST_QUOTE x ,
        csa_sli_all.T_CONV_quote q
where   q.select_indicator is null and 
    q.QUOTE_ID = X.QUOTE_ID and 
    q.HOLD_CODE IN ('CAQ' , NULL )

それは私に必要な結果を与えません。

最後のステートメントをに変更しました

where   q.select_indicator is null and 
    q.QUOTE_ID = X.QUOTE_ID and 
    (q.HOLD_CODE = 'CAQ' or q.hold_code is null)

今、それは私に望ましい結果を与えています。私の質問は

1節NULLで使用できませんか?WHERE IN

2はいの場合どのように

3ロジック(構文ではない:最初の構文が間違っていることはわかっています)を使用すると、どちらのシナリオでも同じ答えが得られますか?

4

7 に答える 7

3

INを使用するwhere句でnull値を使用することはできないため、使用する必要がある場合は、次のように使用してください。

q.HOLD_CODE in ('CAQ', ...) or q.hold_code is null

null値を探している場合は、常に「is null」を使用する必要があるため、INステートメントで使用することはできません。

于 2012-04-19T11:17:28.323 に答える
2

標準演算子が適用されるためNULLINステートメントで使用することはできません。もちろん、これはsを比較すると失敗します。IN=NULL

書くようなものSELECT NULL = NULLです。戻り値はになりますNULL

于 2012-04-19T11:16:48.480 に答える
2

わかりませんが、where句でNULLを使用できるとは思いません。

私はいつも=NULLとISNULLと混同されます

なぜISNULLを使用しないのですか?..。

 WHERE ISNULL(q.HOD_CODE,'CAQ') = 'CAQ'
于 2012-04-19T11:19:34.000 に答える
2

最初にANSI_NULLSOFFを設定すると、IN(Null)Fineを使用できます。

ANSI_NULLS ONを使用すると、NULLとの比較を実行できません(=、>、<など)。

SET ANSI_NULLS OFF
Select 
RPAD(x.QUOTE_ID,20,' ')
from csa_sli_all.T_CONV_XREF_CUST_QUOTE x ,
        csa_sli_all.T_CONV_quote q
where   q.select_indicator is null and 
    q.QUOTE_ID = X.QUOTE_ID and 
    q.HOLD_CODE IN ('CAQ' , NULL )

正常に動作するはずです

于 2012-04-19T11:22:08.573 に答える
2

NULL IN (NULL)UNKNOWNに評価されます。null値を比較するには、is null演算子を使用する必要があります。Nullには特定の処理があります。

サンプル

select case when null in (null) then 1 else 0 end

returns 0

コッドの12の規則3を覚えておいてください

ルール3: null値の体系的な処理:DBMSは、各フィールドがnull(または空)のままになることを許可する必要があります。具体的には、体系的で、すべての通常の値とは異なり(たとえば、数値の場合は「ゼロまたはその他の数値とは異なる」)、データに依存しない「欠落している情報と適用できない情報」の表現をサポートする必要があります。タイプ。また、そのような表現は、DBMSによって体系的な方法で操作される必要があることも意味します。

于 2012-04-19T11:23:18.730 に答える
2

is null代わりにを使用する必要があります= null

フィールドをと比較するNULL場合、SQLクエリISでは「=」演算子の代わりに演算子を使用する必要があります。その理由はANSI_NULLS、接続のオプションがオンの場合、NULL値と比較される式は、trueまたはfalseの値を返さず、不明な値を返すためです。簡単にするために、テーブルxxxに2つのNULL値を含むcol1という名前の列がある場合、このクエリはゼロレコードをフェッチする結果になります。

Select * from xxx where col1 = NULL

一方、このクエリでは、次の2つのレコードがフェッチされます。

Select * from xxx where col1 IS NULL

ただし、ANSI_NULLSをオフに設定すると、これらのクエリは両方とも2つのレコードを返します。

于 2012-04-19T11:25:12.843 に答える
1

サブクエリを使用する代わりに、結合を使用する必要があります。SQL Serverを使用しているという議論のために、次のようなことを行います(明らかにフィールドに入力します)。

SELECT yourField, yourField2 
FROM yourTable t1
INNER JOIN yourTable2 t2 ON t1.Id = t2.Id
WHERE t1.field is null
AND (t1.code = 'CAQ' OR t1.code IS NULL)
于 2012-04-19T11:20:04.953 に答える