2017-07-16 71 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

相關問題