【问题标题】:Returning null and other values. SQL返回 null 和其他值。 SQL
【发布时间】:2020-11-06 09:58:58
【问题描述】:

刚开始接触 SQL,之前真的没有任何编码经验,但它很有趣。 这是我遇到的问题。

WHERE ([Text 7] collate SQL_Latin1_General_CP1_CI_AS like '%perm%' 
   OR Article.Stat2 IN ('70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '83'))
      AND NOT Articletype ='z'

在 Articletype 列中有多个值,z、q、s 和 NULL。 如果我删除 z 它不再返回 NULL 值

如何让它返回 NULL 值和其他值而不是 z 而不会与我最初选择的文章发生冲突。

【问题讨论】:

  • AND (Articletype <> 'z' OR Articletype IS NULL)

标签: sql sql-server null


【解决方案1】:

NULL 不等于任何东西,但相反,NOT 也不等于任何东西。 NULL 是一个 未知 值。与NULL 值进行比较的唯一方法是使用IS NULLIS NOT NULL

对于像YourColumn = 'z' 这样的表达式,如果YourColumn 的值是NULL,那么该表达式的结果是不是 False,而是Unknown。对于 WHERE 而言,这里并不“重要”,因为 Unknown 不是 True,所以它过滤掉的行。

然而,对于NOT(YourColumn = 'z'),其计算结果为NOT(Unknown),即也是 Unknown;这是(重要的)不是True

因此,如果要检查NULL 值,则需要使用IS NULLIS NOT NULL

在这种情况下,如下所示:

WHERE ([Text 7] COLLATE SQL_Latin1_General_CP1_CI_AS like '%perm%' OR Article.Stat2 IN ('70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '83'))
  AND (Articletype != 'z' OR Articletype IS NULL)

几点补充说明:
真的需要COLLATE吗?这将导致查询为 non_SARGable。 COLLATE 在这里实现了什么,将其更改为不区分大小写的排序规则?如果是这样,您最好使用索引 PERSISTED 计算列。

另外,不要在单引号中提供数字;他们不需要他们。你的IN 应该是Stat2 IN (70,71,...,83)

【讨论】:

  • 感谢您的解释和解决方案,是的,您对我为什么使用COLLATE 是正确的。我将研究索引 PERSISTED 计算列的建议。
  • 如果它解决了问题,@IrLurker,请务必将其标记为解决方案。这让未来的读者知道答案很有帮助,并且其他用户知道问题已得到解答。谢谢。
【解决方案2】:

您可以按如下方式扩展检查:

AND (Articletype IS NULL OR Articletype <> 'z')

PS 我改用&lt;&gt;,因为我相信它比NOT ... = 更易读。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多