2017-07-16 95 views
2

我读其中一个SQL查询中使用这样的书SQL AntipatternsSQL的LIKE在Path Enumeration的情况下如何工作?

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

从该表中发现的评论#7祖先:

enter image description here

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

回答

2

首先,如果不明确,||是字符串连接运算符。所以,如果c.path的值是'1/',那么c.path || '%'产生'1/%'

因此,很明显,你不能这样做WHERE field LIKE 'constant%',因为在这种特殊的(奇怪的)类型的查询中,常量可能比字段长,而不是相反。

通常,我们对LIKE的处理是WHERE field LIKE 'constant%',以检查字段的值是否以常量开始。在这里,查询的作者想要查看该常量是否以该字段的值开始,这是一件非常奇怪的事情。

+0

就是这样,我认为||是一个OR。谢谢你太多了。 – Sabuncu

+0

把第二部分放在圆括号中会更加可读,就像这样:WHERE'1/4/6/7 /'LIKE **(c.path ||'%')**; – Sabuncu

1

简单的LIKE SQL中的表达式(与regex LIKE相反,在某些RDBMS中可用)不支持正则表达式。相反,它支持两个特殊的“通配符”字符:下划线_与正则表达式中的点.大致相同,而%百分比大致相当于.*构造。

||在该示例中是连接运算符,类似于运算符+应用于String中的对象。因此,将恒定值1/4/6/7/与来自path列的字符串进行比较,后跟任何字符 - 实质上是前缀匹配。

这是一种糟糕的方法,因为它将表中的数据放在LIKE表达式的右侧。这非常昂贵,因为此操作无法使用索引,从而使搜索运行非常缓慢。

+0

谢谢你的回答,特别是第三段回复:表现。从编程背景来看,||操作员真的使我迷失方向。 – Sabuncu

相关问题