我讀其中一個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謂詞如何工作(即||'%')?
我讀其中一個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