我正在阅读使用SQL查询的书SQL Antipatterns,如下所示:
SELECT *
FROM Comments AS c
WHERE '1/4/6/7/' LIKE c.path || '%';
从此表中找到评论#7的祖先:
我对LIKE使用的正则表达式并不熟悉,并希望了解它是如何工作的。具体而言,文字' 1/4/6/7' 位于LIKE关键字的左侧是否重要?整个WHERE谓词是如何工作的(即 ||'%' )?
答案 0 :(得分:2)
首先,如果不清楚,INSERT INTO `installation` (`sno`, `id`, `email`, `cookie`) VALUES (NULL, '8', 'gmail@gmail.com', 'sadsadsa');
是字符串连接运算符。因此,如果||
的值为c.path
,则'1/'
会产生c.path || '%'
。
所以,显然,你不能做'1/%'
,因为在这种特殊的(奇怪的)查询类型中,常量可能比字段长,而不是相反。
通常,我们对WHERE field LIKE 'constant%'
的处理是LIKE
来检查字段的值是否以常量开头。在这里,查询的作者想要查看常量是否以字段的值开头,这是一件很奇怪的事情。
答案 1 :(得分:1)
SQL中的简单LIKE
表达式(与regex LIKE
相对,在某些RDBMS中可用)不支持正则表达式。相反,它支持两个特殊的“通配符”字符:下划线_
大致相当于正则表达式中的点.
,百分比%
大致相当于.*
构造。
||
是连接运算符,类似于应用于Java中的+
对象的运算符String
。因此,将常量值1/4/6/7/
与path
列中的字符串进行比较,后跟任何字符 - 基本上是前缀匹配。
这是一种糟糕的方法,因为它将表中的数据放在LIKE
表达式的右侧。这非常昂贵,因为此操作无法使用索引,使搜索运行速度非常慢。