Sql 不喜欢和喜欢不返回相反的结果

Sql 不喜欢和喜欢不返回相反的结果,sql,sql-server,tsql,sql-like,Sql,Sql Server,Tsql,Sql Like,我有一个包含200条记录的表,其中10条记录有包含“TAX”一词的文本 当我执行的时候 Select * from tbl1 WHERE [TextCol] LIKE '%TAX%' 然后我正确地得到了这10条记录的结果集 但是当我试图通过 Select * from tbl1 WHERE [TextCol] NOT LIKE '%TAX%' 它只返回100条记录,而不是190条 这是否返回正确的结果 Select * from tbl1 WHERE COALESCE([TextCol],'

我有一个包含200条记录的表,其中10条记录有包含“TAX”一词的文本

当我执行的时候

Select * from tbl1 WHERE [TextCol] LIKE '%TAX%'
然后我正确地得到了这10条记录的结果集

但是当我试图通过

Select * from tbl1 WHERE [TextCol] NOT LIKE '%TAX%'
它只返回100条记录,而不是190条


这是否返回正确的结果

Select * from tbl1 WHERE COALESCE([TextCol],'-1') NOT LIKE '%TAX%'
我认为空值是这里的问题,如果列包含它们,则与“%TAX%”不同的NULL将返回UNKNOWN/NULL,因此不会被选择

我建议你读一下,或者

正如@ughai所建议的,如果性能是一个问题,您也可以使用:

  Select * from tbl1 
  WHERE [TextCol] NOT LIKE '%TAX%'
     OR [TextCol] IS NULL
SQL比较运算符会产生三个可能的值:True、False和Unknown。如果一个或两个操作数都为空,则结果未知。考虑下面的例子,我们将一些人的年龄与常数18的值进行比较:
21   >= 18 -- True
15   >= 18 -- False
NULL >= 18 -- Unknown
如您所见,数据库可以/不会决定NULL是否大于/等于18

B数据库将只返回where子句计算结果为True的行。将表达式(例如,其中年龄>=18)反转为其中年龄<18不会影响未知结果

您可以使用来匹配空值。以下查询将选择列与模式不匹配或列为空的行:

WHERE [TextCol] NOT LIKE '%TAX%' OR [TextCol] IS NULL

ISNULL和COALESCE等函数可用于将NULL转换为某个值。

我对带有NULL的简单int列的IN运算符也有同样的问题。 我发现这些地方并不像我想的那样彼此相反。我可以从排数上看出来

select * from Dest where id in(select id from Source)
select * from Dest where id NOT in(select id from Source)
为了让彼此颠倒,我也不得不将它们改写成这样:

select * from Dest where isnull(id,-2)  in(select isnull(id,-1) from Source) 
select * from Dest where isnull(id,-2) NOT in(select isnull(id,-1) from Source) 

该列是否有空值?是的,该列中有空值。请尽可能避免在搜索字符串的开头使用%。“这是相当沉重的。”穆斯林本德豪说:“有很多方法可以优化中缀查询。我相信SQL Server中的主要方法是全文搜索机制,但我可能不知道有更好的选择。在PostgreSQL中,可以使用三元索引来提高效率。但是,对于一个200行的表,它甚至不值得索引。什么?MySQL与青少年词汇兼容吗?我建议使用[TextCol]而不是像“%TAX%”或[TextCol]为NULL,因为如果用户想要包含NULL值,它会有更好的性能。她说190条记录,所以我怀疑性能是个问题,但无论如何都要编辑,因为其他人可能会阅读此答案@ughai。谢谢!NULL是问题所在。然后与“%TAX%”不同的NULL将返回false-不,不会。如果它返回false,那么将NOT放在更高的级别来解决问题将是微不足道的:如果像“%TAX%”这样的NULL返回false,那么像“%TAX%”这样的NOTNULL将返回true。相反,它返回unknown。Unknown还意味着该行不会被选中。这不是性能问题,这也是代码的清晰版本。省去了人们对-1从何而来的困惑。[TextCol]不喜欢“%TAX%”和[TextCol]不喜欢“%TAX%”有什么意义呢?而这个代码片段可能会解决这个问题,包括一个提高帖子质量的解释。记住,你是在将来回答读者的问题,而不仅仅是现在提问的人!请您的回答添加解释,并说明适用的限制和假设。更正:所有涉及空值的操作都会导致未知…除非它们不存在,例如,从TBL1中选择COUNTTextCol作为计数您的编辑“所有操作”->“比较运算符”良好+1
select * from Dest where id in(select id from Source)
select * from Dest where id NOT in(select id from Source)
select * from Dest where isnull(id,-2)  in(select isnull(id,-1) from Source) 
select * from Dest where isnull(id,-2) NOT in(select isnull(id,-1) from Source)