2012-04-02 49 views
0

在我的表中有代碼,這些代碼基本上是十進制值。例如,該代碼列包含像001.0數據,00.10002.000.20等我必須寫其示出了下面的結果而從UI搜索代碼值中的SQL查詢:搜索條件的SQL查詢

  • 如果用戶搜索0010,我要顯示所有的值001.000.10

  • 如果用戶搜索001.0,我必須表明像001.0值,001.1

  • 如果用戶搜索00.10,我必須表明價值00.1000.12

請幫我寫SQL查詢上述標準。

+0

執行代碼總是隻包含4個數字和一個(隨機放置)小數點?這個觀點總是存在嗎? – 2012-04-02 10:48:23

+0

如果用戶輸入「001.1」,結果如何? – 2012-04-02 10:49:02

+3

規則是「如果沒有'.'被指定,所有的數字都必須完全匹配,並且'.'被忽略,並且'如果'.'被指定,那麼一個完全匹配必須發生直到最後一個非零數字」 ?請儘量仔細描述匹配規則 - 以上兩個是根據您的有限示例進行的最佳猜測。你可以用更多的想法來描述它們,我們就更有可能爲整體問題提出答案。 – 2012-04-02 10:49:07

回答

1

並非所有的事情都完全清楚你的規則,但我希望以下內容至少能成爲你的起點。

顯然,搜索詞應該以兩種方式處理,具體取決於它是否包含小數點。所以首先你需要知道點是否存在。這可以通過使用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') + '%' 
+1

如果無點搜索是常見的,那麼可以通過具有可被索引的額外的'UndottedCode'列來改善性能。觸發器可以根據對「代碼」列的更改來維護該值。非規範化的性能!(sm) – HABO 2012-04-02 12:55:41

+0

@ user92546:好點。計算列可能是更好的選擇。 – 2012-04-02 12:58:24