在我的表中有代碼,這些代碼基本上是十進制值。例如,該代碼列包含像001.0
數據,00.10
,002.0
,00.20
等我必須寫其示出了下面的結果而從UI搜索代碼值中的SQL查詢:搜索條件的SQL查詢
如果用戶搜索
0010
,我要顯示所有的值001.0
,00.10
如果用戶搜索
001.0
,我必須表明像001.0
值,001.1
等如果用戶搜索
00.10
,我必須表明價值00.10
,00.12
等
請幫我寫SQL查詢上述標準。
在我的表中有代碼,這些代碼基本上是十進制值。例如,該代碼列包含像001.0
數據,00.10
,002.0
,00.20
等我必須寫其示出了下面的結果而從UI搜索代碼值中的SQL查詢:搜索條件的SQL查詢
如果用戶搜索0010
,我要顯示所有的值001.0
,00.10
如果用戶搜索001.0
,我必須表明像001.0
值,001.1
等
如果用戶搜索00.10
,我必須表明價值00.10
,00.12
等
請幫我寫SQL查詢上述標準。
並非所有的事情都完全清楚你的規則,但我希望以下內容至少能成爲你的起點。
顯然,搜索詞應該以兩種方式處理,具體取決於它是否包含小數點。所以首先你需要知道點是否存在。這可以通過使用CHARINDEX()
函數來完成:如果它返回0,則小數點在搜索項中不存在,否則它就在那裏。因此,你的完成條件的結構將是這樣的:
WHERE CHARINDEX('.', @SearchTerm) = 0 AND … /* condition to match '0010'-like input */
OR CHARINDEX('.', @SearchTerm) > 0 AND … /* condition to match input containing '.' */
條件來搜索長期沒有.
可能是這樣的:
REPLACE(Code, '.', '') = @SearchTerm /* or maybe LIKE @SearchTerm + '%'? */
爲當搜索詞幷包含如果條件.
在我看來,比前一個麻煩,但無論如何,這裏是我想出了:
Code LIKE REPLACE(RTRIM(REPLACE(@SearchTerm, '0', ' ')), ' ', '0') + '%'
它是如何工作,一步一個腳印,使用'001.0'
和'00.10'
爲例:
Initial value '001.0' '00.10'
REPLACE(@SearchTerm, '0', ' ') ' 1. ' ' .1 '
RTRIM(REPLACE(@SearchTerm, '0', ' ')) ' 1.' ' .1'
REPLACE(RTRIM(REPLACE(@SearchTerm, '0', ' ')), ' ', '0') '001.' '00.1'
REPLACE(RTRIM(REPLACE(@SearchTerm, '0', ' ')), ' ', '0') + '%' '001.%' '00.1%'
所以,你可以看到,該表達式的值應該滿足您的規則包含.
搜索字詞的面具。
拉所有的條件一起,我們得到以下WHERE
條款:
WHERE CHARINDEX('.', @SearchTerm) = 0 AND REPLACE(Code, '.', '') = @SearchTerm
OR CHARINDEX('.', @SearchTerm) > 0 AND
Code LIKE REPLACE(RTRIM(REPLACE(@SearchTerm, '0', ' ')), ' ', '0') + '%'
如果無點搜索是常見的,那麼可以通過具有可被索引的額外的'UndottedCode'列來改善性能。觸發器可以根據對「代碼」列的更改來維護該值。非規範化的性能!(sm) – HABO 2012-04-02 12:55:41
@ user92546:好點。計算列可能是更好的選擇。 – 2012-04-02 12:58:24
執行代碼總是隻包含4個數字和一個(隨機放置)小數點?這個觀點總是存在嗎? – 2012-04-02 10:48:23
如果用戶輸入「001.1」,結果如何? – 2012-04-02 10:49:02
規則是「如果沒有'.'被指定,所有的數字都必須完全匹配,並且'.'被忽略,並且'如果'.'被指定,那麼一個完全匹配必須發生直到最後一個非零數字」 ?請儘量仔細描述匹配規則 - 以上兩個是根據您的有限示例進行的最佳猜測。你可以用更多的想法來描述它們,我們就更有可能爲整體問題提出答案。 – 2012-04-02 10:49:07