关于%和=和<>之间缺乏兼容性的深奥思考

时间:2017-03-11 04:53:00

标签: sql sql-server tsql sql-like

我是编程世界的新手,但请尽可能地幽默我。

我知道%可以使用LIKE而不是LIKE。例如,以下两个查询有效:

--QUERY 1
SELECT *
FROM TrumpFeccandid_Pacs
WHERE PACID NOT LIKE 'C%'

--QUERY 2
SELECT *
FROM TrumpFeccandid_Pacs
WHERE PACID LIKE 'C%'

但%不适用于=或<&gt ;.例如,以下两个查询不起作用:

--QUERY A
SELECT * 
FROM TrumpFeccandid_Pacs 
WHERE PACID <> 'C%'

--QUERY B
SELECT *
FROM TrumpFeccandid_Pacs
WHERE PACD = 'C%'

为什么会这样?直观地说,我觉得查询A和B不仅可以工作,而且查询A应该等同于查询1,查询B应该等同于查询2.

这些示例使用的是Sql Server 2016中的T-SQL。

3 个答案:

答案 0 :(得分:1)

  

直观地说我觉得

这就是你出错的地方!

LIKE以某种方式定义=<>也是如此。大概设计这种语言的人试图让它易于理解,以便于理解,记忆和使用。他们没有做的,因为他们做不到,就是定义它,以满足每个人的期望和预感。

为什么LIKE=不同?

    如果a like 'C%'以&#39; C&#39; 开头,则
  • a为真 如果a = 'C%'正好是2个字母的字符串,那么
  • a为真&#39; C%&#39;

但IMO这个故事的真正道德是,如果你想知道语言是如何运作的,最好的建议是RTFM。特别是当它没有按预期工作时。

答案 1 :(得分:1)

想象一个像这样的相对简单的查询:

SELECT *
FROM A
JOIN B ON A.Name = B.Name

如果=LIKE一样工作,如果Name包含百分比或下划线,上帝会帮助您!

答案 2 :(得分:0)

SQL提供了与Unix,grep,sed中使用的标准模式匹配。这些图案只能用于“喜欢”和“不喜欢”的操作员..... LIKE / NOT LIKE是布尔类型,如果match_expression与指定的模式匹配,它们返回TRUE / FALSE。

以下是用于匹配模式的各种外卡:

% = Any number of characters
_ = Any Single character 
[] = Any single character within the specified range 
[^] = Any single character not within the specified range

关于模式和类似运算符的文档: SQL server LIKE operator