2011-02-28 23 views
15

在SQL中執行startswith(expression)的適當方法是什麼?SQL startswith(使用`LIKE`)表達式

我可以用LIKE ((expression) || '%')來做,但對我來說看起來不太好。

全面查詢是形式:

SELECT …, (SELECT COUNT(*) 
      FROM post AS child 
      WHERE child.path LIKE (post.path || '%') 
      AND child.depth >= post.depth) 
FROM post WHERE … 

我想這是最好使用LIKE因爲DB索引這種情況。

+3

您在編寫相關子查詢,你所擔心的類似條款看起來如何?爲什麼地球上你會關心這個陳述看起來不錯。在SQl語句中有三件事值得擔心:是否返回正確的結果,它是否表現良好(提示相關的子查詢通常不會,應該避免)並且它是安全的?看起來不錯,甚至沒有接近第四。 – HLGEM 2011-02-28 18:09:40

+0

它的執行效果和它可能的一樣(實際上,這個特定的子查詢只對所有使用CASE WHEN的返回對象的子集完成)。其他的考慮也不是什麼大問題,雖然在其他類似的情況下,擔心安全性可能會導致同樣的問題('post.path'沒有轉義,不是嗎?在這種情況下我會如何正確地轉義它?現在它已知儘管安全。) – HoverHell 2011-02-28 18:17:20

+0

只是一個問題。在你的數據中可能有'child.path LIKE(post.path ||'%')AND child.depth 2011-02-28 20:48:54

回答

23

只需使用LIKE 'input%'。 IE:

WHERE child.path LIKE post.path + '%' 

(我認爲這是SQL Server,雖然這句法可能在其他地方工作)

+3

該語法不適用於其他數據庫,因爲+ for字符串連接特定於Microsoft。所有符合標準的DBMS都使用'||'。但除此之外,我同意該聲明應該適用於其他DBMS – 2011-02-28 18:02:43

+2

這就是我使用的(並且我在問題中寫了同樣的東西)。 – HoverHell 2011-02-28 18:18:19

2

在標準SQL中,你還可以說:

where position(post.path in child.path) = 0 

我不知道如果你的RDBMS支持。 PostgreSQL的確。

+0

嗯,有趣。但是不會更糟,可能是因爲沒有使用數據庫索引(對於僅以'%'結尾的LIKE語句)? – HoverHell 2011-02-28 18:19:56

+0

很可能。它完全取決於查詢規劃器是否足夠聰明以注意'= 0',並意識到這是可以用索引處理的前綴查詢(如果有索引)。這當然不可能比LIKE版本更快。 – 2011-03-01 09:23:10

0

您可以使用

where DATE LIKE '[(SELECT STR(YEAR(GETDATE())-1))]%'

WHERE child.path LIKE '[(SELECT STR(YEAR(GETDATE())-1))]%' (post.path || '%')