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%'
检查字段的值是否以常量开头。这里查询的作者想看看常量是否以字段的值开头,这是一件很奇怪的事情。
我正在阅读 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%'
检查字段的值是否以常量开头。这里查询的作者想看看常量是否以字段的值开头,这是一件很奇怪的事情。