SQL 的 LIKE 在路径枚举的情况下如何工作?

How does SQL's LIKE work in case of Path Enumeration?

我正在阅读 SQL Antipatterns 这本书,其中 SQL 查询是这样使用的:

SELECT *
FROM Comments AS c
WHERE '1/4/6/7/' LIKE c.path || '%';

从这个 table 中找到评论 #7 的祖先:

我不太熟悉用于 LIKE 的正则表达式,希望了解它的工作原理。具体来说,文字 '1/4/6/7' 位于 LIKE 关键字的左侧是否重要?整个 WHERE 谓词如何工作(即 || '%')?

SQL 中的简单 LIKE 表达式(相对于 regex LIKE,在某些 RDBMS 中可用)不支持正则表达式。相反,它支持两个特殊的 "wildcard" 字符:大致相当于正则表达式中的点 . 的下划线 _ 和大致相当于 .* 的百分号 %构造。

示例中的

||是连接运算符,类似于Java中应用于String对象的运算符+。因此,常量值 1/4/6/7/path 列中后跟任何字符的字符串进行比较 - 本质上是前缀匹配。

这是一个糟糕的方法,因为它将来自 table 的数据放在 LIKE 表达式的右侧。这是非常昂贵的,因为这个操作不能使用索引,使得搜索运行非常慢。

首先,如果不清楚,||是字符串连接运算符。因此,如果 c.path 的值为 '1/',则 c.path || '%' 会产生 '1/%'.

所以,显然,您不能执行 WHERE field LIKE 'constant%',因为在这种特殊的(奇怪的)查询中,常量可能比字段长,而不是相反。

通常我们对LIKE做的是WHERE field LIKE 'constant%'检查字段的值是否以常量开头。这里查询的作者想看看常量是否以字段的值开头,这是一件很奇怪的事情。