为什么这返回不同的结果?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (20)

我有一张有200份记录的桌子,其中10份记录的文本中包含“税收”一词。

当我执行

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%'

我相信NULL值是问题在这里,如果列包含它们,然后NULL NOT LIKE '%TAX%'将返回UNKNOWN/NULL,因此将不会被选中。

如果性能是一个问题,还可以使用:

  Select * from tbl1 
  WHERE [TextCol] NOT LIKE '%TAX%'
     OR [TextCol] IS NULL
用户回答回答于

(A) SQL比较运算符产生三个可能的值:True,False和Unknown。如果一个或两个操作数NULL的结果是未知的。考虑下面的例子,我们将一些值(一个人的年龄)与一个常数(18)进行比较:

21   >= 18 -- True
15   >= 18 -- False
NULL >= 18 -- Unknown

正如你所看到的,数据库可以/不会决定是否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

诸如ISNULL和之类的函数COALESCE可以用来转化NULL为某种值。

所属标签

可能回答问题的人

  • 西风

    renzha.net · 站长 (已认证)

    9 粉丝1 提问5 回答
  • uncle_light

    5 粉丝518 提问3 回答
  • 学生

    2 粉丝477 提问3 回答
  • 军哥

    重庆雷驰信息技术有限公司 · 经理 (已认证)

    5 粉丝1 提问3 回答

扫码关注云+社区

领取腾讯云代金券