2012-03-27 24 views
5
之間找到名字

簡單問題:SQL - 如果標準AF

我需要一個解決方案,使我能找到,可以說名,AF之間,包括與F.

如果你開始的所有名稱使用BETWEEN或A> =值< = F你會發現它停在F.所以我發佈這個建議。

注意: 用戶將看到2個文本框接受範圍用戶可以鍵入。用戶在F界限內改進了多遠:'Fa'中的用戶類型表示結果應該返回:Fauder,Fail,Famber等...

我目前有2個解決方案,但有一個一個更好的方法。

解決方案1: 這會將1添加到外部邊界,但如果名稱爲單個'G',則可能會包含結果,但不太可能。 WHERE名> = 'A' AND < = CHAR(ASCII( 'F')+ 1)

解決方案2: 此溶液追加的字母字段長度倍最後一個字母。 其中name> =「A」和< =「FZZZZZZZZZZZZZZZZZZZZZ」

儘管上述解決方案是可行的,我的搜索可以被細化爲這樣: A到FS(應該給我一切從A到和包括Fs的.. ..)。有了這個解決方案,#1破解了,因爲它使用單個ASCII。

建議歡迎。

+0

用於什麼服務器? – 2012-03-27 16:06:04

+0

SQL Server 2000或更高版本 – ActiveX 2012-03-27 16:12:03

回答

1

在評論你擴大需求,包括A - Fxxx

SET @start = 'A' 
SET @end = 'Fxxx' 

SELECT 
    * 
FROM 
    table 
WHERE 
    (name >= @start AND name < @end) 
    OR (name LIKE @end + '%') 

請注意,這不包括在name字段上的功能;這些功能會阻止範圍尋找索引。但是,包含OR也會降低索引查找的效率。雖然這是額外的代碼,這實際上可能是更好的性能,是某些情況下...

SELECT 
    * 
FROM 
    table 
WHERE 
    (name >= @start AND name < @end) 

UNION ALL 

SELECT 
    * 
FROM 
    table 
WHERE 
    (name LIKE @end + '%') 


編輯

現在回想起來,你解決方案2,雖然你不喜歡它,可能是最好的。

Fxxx轉換爲FxxxZZZZZZZZZZ對於STUFF()來說很簡單,只要知道最大字符串長度,您應該按照數據庫的設置進行操作。

它在name字段沒有任何功能,並且在WHERE子句中不使用OR。這意味着您可以在任何索引上獲得純搜索範圍。

表現明智,我不認爲你可以改善這一點。

+0

這就是我正在尋找的!非常感謝,謝謝大家的回覆。 – ActiveX 2012-03-27 16:47:37

9

你可以這樣做:

WHERE name >= 'A' AND name < 'G' 
+0

只有我們可以硬編碼的東西。我正在尋找一個公式。上面還會返回一個名字,即'G',這是不正確的。 – ActiveX 2012-03-27 16:12:33

+2

@ActiveX - 你對「公式」的含義是什麼?你的查詢的期望參數是什麼?不,它不會返回一個名字是'G'。 – Lamak 2012-03-27 16:14:26

+0

@ActiveX - 它使用'<而不是'<='或'BETWEEN'。這是一種非常正常且強大的模式,它並不關心'name'字段中有多少個字符,或者需要'name'字段中的任何函數(這很重要,因爲這樣的函數會破壞使用索引範圍的能力尋求)。就個人而言,這正是我所使用的。 – MatBailie 2012-03-27 16:18:06

4

這個怎麼樣?

WHERE SUBSTR(name, 1, 1) >= 'A' AND SUBSTR(name, 1, 1) <= 'F' 
+0

不錯。這將工作,但需要更多的編程。在我的情況下,用戶可以將搜索細化到:A - Fs或A Fxxx。我可以使用你的方法,並編寫一些代碼來計算第二個邊界的字段長度並將其提供給substr,但它變得混亂。 – ActiveX 2012-03-27 16:18:43

+2

工作,但在'name'字段周圍放置一個函數可以防止索引查找,並導致全面掃描。 – MatBailie 2012-03-27 16:19:13

+1

@ActiveX - 你是什麼意思使用可以指定'A' - 'Fxxx'?這會顯着改變您在問題中描述的行爲。請你能更新問題以包括你需要的所有功能嗎? – MatBailie 2012-03-27 16:22:40

2

這會不會對你的工作:

select * 
from MyTable 
where left(name, 1) between 'a' and 'f' 
+1

工作,但在'name'字段周圍放置一個函數可防止索引查找,並導致全面掃描。 – MatBailie 2012-03-27 16:19:22

2

你能做出多少簡單?

WHERE NAME LIKE '[a-f]%' 
+0

只能使用單個字符值。不在範圍內,例如:A-Fa,A-Fb。我沒有明確表示我的問題,我很抱歉。我編輯了我的問題並添加了更多細節。 – ActiveX 2012-03-27 16:56:33