2008-09-30 23 views
5

我需要爲我的軟件用戶添加能力來按字符範圍選擇記錄。
如何編寫一個查詢,返回名稱落在Ba-Bi範圍內的所有窗口小部件?根據字符範圍選擇字符串字段的最佳方法是什麼?

目前我使用的不是運營商大於少,所以上面的例子將成爲:

select * from widget 
where name >= 'ba' and name < 'bj' 

注意如何我已經「增加」的上界的最後一個字符從i到j,使「自行車」不會被遺漏。

有沒有一種通用的方法來查找給定字符後的下一個字符根據字段的排序規則,還是創建第二個條件會更安全?

select * from widget 
where name >= 'ba' 
and (name < 'bi' or name like 'bi%') 

我的應用程序需要支持本地化。這種查詢對不同的字符集有多敏感?

我還需要同時支持MSSQL和Oracle。無論數據中出現何種語言,我的選項可以確保忽略字符外框?

回答

3

讓我們直接跳到本地化。你會說「aa」> =「ba」嗎?可能不會,但這就是瑞典的地方。另外,你根本無法假定你可以忽略任何語言的套路。外殼是明確的語言依賴,最常見的例子是土耳其語:大寫字母i是İ。小寫字母I是我。

現在,您的SQL DB通過「整理順序」來定義<,==等的結果。這絕對是語言特定的。所以,你應該明確地控制這個,對於每個查詢。土耳其語整理順序將把我所屬的地方(土耳其語)。你不能依靠默認的排序規則。

至於「增量部分」,不要打擾。堅持> =和< =。

0

無奈的是,在Oracle子字符串函數是SUBSTR(),而SQL-Server是SUBSTRING()。

你可以在它們中的一個或兩個上寫一個簡單的包裝,以便它們共享相同的函數名稱+原型。

然後,你可以使用

MY_SUBSTRING(name, 2) >= 'ba' AND MY_SUBSTRING(name, 2) <= 'bi' 

或相似。

0

您可以使用此...

select * from widget 
where name Like 'b[a-i]%' 

其中名稱與B開始這將匹配任何行,第二個字符是在一個範圍內對我,和任何其他字符跟進。

+0

我相信,至少在MySQL中,這將是「rlike」,而不是「喜歡」。 – pilsetnieks 2008-09-30 12:24:52

0

我認爲我會採取一些簡單的措施,例如在上限末尾附加一個高分類字符串。喜歡的東西:

select * from widgetwhere name >= 'ba' and name <= 'bi'||'~' 

我不知道這會生存EBCDIC轉換雖然

0

你也可以做這樣的:

select * from widget 
where left(name, 2) between 'ba' and 'bi' 

如果你的標準長度的變化(因爲你好像在評論,表示你左),查詢需要有長度爲輸入也:

declare @CriteriaLength int 
set @CriteriaLength = 4 
select * from widget 
where left(name, @CriteriaLength) between 'baaa' and 'bike' 
相關問題