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

时间:2017-07-16 09:23:55

标签: sql sql-like

我正在阅读使用SQL查询的书SQL Antipatterns,如下所示:

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 个答案:

答案 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表达式的右侧。这非常昂贵,因为此操作无法使用索引,使搜索运行速度非常慢。