Sha*_*nka 58 sql t-sql sql-server sql-like
我有一张包含200条记录的表格,其中10条记录的文字包含"TAX"字样.
当我执行时
Select * from tbl1 WHERE [TextCol] LIKE '%TAX%'
Run Code Online (Sandbox Code Playgroud)
然后我正确地得到了这10条记录的结果集.
但是,当我试图排除那些记录
Select * from tbl1 WHERE [TextCol] NOT LIKE '%TAX%'
Run Code Online (Sandbox Code Playgroud)
它仅返回100条记录,而不是190条记录.
sag*_*agi 75
这会返回正确的结果吗?
Select * from tbl1 WHERE COALESCE([TextCol],'-1') NOT LIKE '%TAX%'
Run Code Online (Sandbox Code Playgroud)
我认为NULL
值是这里的问题,如果列包含它们,那么NULL NOT LIKE '%TAX%'
将返回UNKNOWN/NULL
,因此将不会被选中.
我建议你阅读有关处理NULL
值的信息,或者在这里.
正如@ughai建议的那样,如果性能是一个问题,你也可以使用:
Select * from tbl1
WHERE [TextCol] NOT LIKE '%TAX%'
OR [TextCol] IS NULL
Run Code Online (Sandbox Code Playgroud)
Sal*_*n A 18
(A) SQL比较运算符导致三个可能的值:True,False和Unknown.如果一个或两个操作数都是,NULL
则结果为Unknown.考虑以下示例,我们将一些值(一个人的年龄)与常量(18)进行比较:
21 >= 18 -- True
15 >= 18 -- False
NULL >= 18 -- Unknown
Run Code Online (Sandbox Code Playgroud)
如您所见,数据库可以/不会决定是否NULL
大于/等于18.
(B)数据库只返回WHERE
子句求值为True的行.反转表达式(例如,WHERE age >= 18
更改为WHERE age < 18
)不会影响未知结果.
您可以使用IS [NOT] NULL
匹配NULL
值.以下查询将选择列与模式不匹配的行或列为NULL:
WHERE [TextCol] NOT LIKE '%TAX%' OR [TextCol] IS NULL
Run Code Online (Sandbox Code Playgroud)
诸如ISNULL
和之类的函数COALESCE
可用于转换NULL
为某些值.