返回 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 NULL
和 IS NOT NULL
.
对于像 YourColumn = 'z'
这样的表达式,如果 YourColumn
的值为 NULL
那么该表达式的结果是 not False
,是 Unknown
。出于 WHERE
的目的,它并不“重要”,因为 Unknown
不是 True
,因此它过滤掉了行。
然而,对于 NOT(YourColumn = 'z')
,这将计算为 NOT(Unknown)
,即 也 Unknown
;这是(重要的)不是 True
.
因此,如果要检查 NULL
值,则需要使用 IS NULL
和 IS 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)
.
刚开始 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 NULL
和 IS NOT NULL
.
对于像 YourColumn = 'z'
这样的表达式,如果 YourColumn
的值为 NULL
那么该表达式的结果是 not False
,是 Unknown
。出于 WHERE
的目的,它并不“重要”,因为 Unknown
不是 True
,因此它过滤掉了行。
然而,对于 NOT(YourColumn = 'z')
,这将计算为 NOT(Unknown)
,即 也 Unknown
;这是(重要的)不是 True
.
因此,如果要检查 NULL
值,则需要使用 IS NULL
和 IS 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)
.