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

An esoteric pondering regarding the lack of compatibility between % and = and <>

我是编程界的新手,但请多多包涵。

我知道 % 适用于 LIKE 和 NOT LIKE。例如,以下两个查询有效:

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

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

但是 % 不适用于 = 或 <>。例如,以下两个查询不起作用:

--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。

SQL 提供标准模式匹配,如 Unix、grep、sed 中使用的模式匹配。这些模式只能与运算符 "LIKE" 和 "NOT LIKE" 一起使用...... LIKE/NOT LIKE 是布尔类型,即它们 returns TRUE/FALSE 如果 match_expression 匹配指定的模式。

以下是用于匹配模式的各种通配符:

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

Intuitively speaking I feel like

这就是你出错的地方!

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

为什么 LIKE= 不同?

    如果 a 以 'C' 开头,则
  • a like 'C%' 为真 如果 a 恰好是 2 个字母的字符串 'C%'
  • ,则
  • a = 'C%' 为真

但 IMO 这个故事的真正寓意是,如果您想了解该语言的工作原理,最好的建议是 RTFM。特别是当它没有按预期工作时。

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

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

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