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 我们不能NULLWHERE IN子句中使用吗?

2 如果是,如何

3 按逻辑(不是语法:我知道第一种语法是错误的)两种情况都会给出相同的答案?

4

7 回答 7

3

您不能在使用 IN 的 where 子句中使用空值,因此如果您需要使用它,请像这样使用它:

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

如果你正在寻找一个空值,你总是必须使用“is null”,因此你不能在 IN 语句中使用它

于 2012-04-19T11:17:28.323 回答
2

您不能使用NULLinIN语句,因为IN应用了标准=运算符。当然,这在比较NULLs 时会失败。

就像写作一样SELECT NULL = NULL。返回值将是NULL.

于 2012-04-19T11:16:48.480 回答
2

您将不得不is null使用= null.

在将字段与 进行比较时NULL,SQL 查询应使用IS运算符代替“=”运算符。原因是如果ANSI_NULLS连接的选项为 On,则与 NULL 值比较的表达式将不会返回 true 或 false 值,而是会返回未知值。为简单起见,如果表 xxx 有一个名为 col1 的列,其中包含两个 NULL 值,则此查询将导致获取零记录:

Select * from xxx where col1 = NULL

同时,此查询将导致获取两条记录:

Select * from xxx where col1 IS NULL

但是,如果您将 ANSI_NULLS 设置为关闭,那么这两个查询都将返回两条记录。

于 2012-04-19T11:25:12.843 回答
2

不确定,但我认为您不能在 where 子句中使用 NULL。

我总是对 =NULL 和 IS NULL 感到困惑

你为什么不使用 ISNULL 即...

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

如果先设置 ANSI_NULLS OFF,则可以使用 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)评估为未知。要比较空值,您应该使用is null运算符。Null 有特定的处理方法。

样品

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

returns 0

记住 Codd 规则 3

规则 3:空值的系统处理:DBMS 必须允许每个字段保持为空(或为空)。具体来说,它必须支持系统的、不同于所有常规值(例如,在数值的情况下,“与零或任何其他数字不同”)和独立于数据的“缺失信息和不适用信息”的表示类型。这也暗示了这些表示必须由 DBMS 以系统的方式进行操作。

于 2012-04-19T11:23:18.730 回答
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 回答