返回 null 和其他值。 SQL

Returning null and other values. SQL

刚开始 fiddle 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 它不再 return NULL 值

如何在不与我最初选择的文章冲突的情况下将其设为 return NULL 值和其他值而不是 z。

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

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

PS 我改用 <> 因为我认为它比 NOT ... =.

更具可读性

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

对于像 YourColumn = 'z' 这样的表达式,如果 YourColumn 的值为 NULL 那么该表达式的结果是 not 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 在这里实现了什么,将其更改为非 case-sensitive 排序规则?如果是这样,使用索引 PERSISTED 计算列可能会更好。

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