SQL的LIKE在Path Enumeration的情况下如何工作?
我读其中一个SQL查询中使用这样的书SQL Antipatterns:SQL的LIKE在Path Enumeration的情况下如何工作?
SELECT *
FROM Comments AS c
WHERE '1/4/6/7/' LIKE c.path || '%';
从该表中发现的评论#7祖先:
我没有太多熟悉LIKE使用的正则表达式,并希望了解它如何工作。具体而言,文字'1/4/6/7'位于LIKE关键字的左侧是否重要?整个WHERE谓词如何工作(即||'%')?
首先,如果不明确,||
是字符串连接运算符。所以,如果c.path
的值是'1/'
,那么c.path || '%'
产生'1/%'
。
因此,很明显,你不能这样做WHERE field LIKE 'constant%'
,因为在这种特殊的(奇怪的)类型的查询中,常量可能比字段长,而不是相反。
通常,我们对LIKE
的处理是WHERE field LIKE 'constant%'
,以检查字段的值是否以常量开始。在这里,查询的作者想要查看该常量是否以该字段的值开始,这是一件非常奇怪的事情。
简单的LIKE
SQL中的表达式(与regex LIKE
相反,在某些RDBMS中可用)不支持正则表达式。相反,它支持两个特殊的“通配符”字符:下划线_
与正则表达式中的点.
大致相同,而%
百分比大致相当于.*
构造。
||
在该示例中是连接运算符,类似于运算符+
应用于String
中的对象。因此,将恒定值1/4/6/7/
与来自path
列的字符串进行比较,后跟任何字符 - 实质上是前缀匹配。
这是一种糟糕的方法,因为它将表中的数据放在LIKE
表达式的右侧。这非常昂贵,因为此操作无法使用索引,从而使搜索运行非常缓慢。
谢谢你的回答,特别是第三段回复:表现。从编程背景来看,||操作员真的使我迷失方向。 – Sabuncu
就是这样,我认为||是一个OR。谢谢你太多了。 – Sabuncu
把第二部分放在圆括号中会更加可读,就像这样:WHERE'1/4/6/7 /'LIKE **(c.path ||'%')**; – Sabuncu