我确实犯了一个愚蠢的错误,但我无法弄清楚:
在SQL Server 2005中,我尝试选择所有客户,除了那些在凌晨2点之前预订的客户.
当我运行此查询时:
SELECT idCustomer FROM reservations
WHERE idCustomer NOT IN
(SELECT distinct idCustomer FROM reservations
WHERE DATEPART ( hour, insertDate) < 2)
Run Code Online (Sandbox Code Playgroud)
我得到0结果.
但
SELECT idCustomer FROM reservations
Run Code Online (Sandbox Code Playgroud)
返回152.000结果和"NOT IN"部分:
SELECT distinct idCustomer FROM reservations
WHERE DATEPART ( hour, insertDate) < 2
Run Code Online (Sandbox Code Playgroud)
仅返回284行
Amy*_*y B 66
SELECT distinct idCustomer FROM reservations
WHERE DATEPART ( hour, insertDate) < 2
and idCustomer is not null
Run Code Online (Sandbox Code Playgroud)
确保list参数不包含空值.
这是一个解释:
WHERE field1 NOT IN (1, 2, 3, null)
Run Code Online (Sandbox Code Playgroud)
是相同的:
WHERE NOT (field1 = 1 OR field1 = 2 OR field1 = 3 OR field1 = null)
Run Code Online (Sandbox Code Playgroud)
(*)编辑:这个解释非常好,但我想解决一件事,以避免未来的挑选.(TRUE或NULL)将评估为TRUE.例如,如果field1 = 3,则这是相关的.该TRUE值将被否定为FALSE并且该行将被过滤.
它总是危险的,有NULL在IN名单-它往往表现为预期的IN,但不是为NOT IN:
IF 1 NOT IN (1, 2, 3, NULL) PRINT '1 NOT IN (1, 2, 3, NULL)'
IF 1 NOT IN (2, 3, NULL) PRINT '1 NOT IN (2, 3, NULL)'
IF 1 NOT IN (2, 3) PRINT '1 NOT IN (2, 3)' -- Prints
IF 1 IN (1, 2, 3, NULL) PRINT '1 IN (1, 2, 3, NULL)' -- Prints
IF 1 IN (2, 3, NULL) PRINT '1 IN (2, 3, NULL)'
IF 1 IN (2, 3) PRINT '1 IN (2, 3)'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
183082 次 |
| 最近记录: |