2016-12-05 56 views
3

我有一個索引(非聚集)字符串列(我們叫它「標識」)上的表具有以下行值:如何有效地在一個非常大的表中與SQL Server中的某個值最終找到行?

`0000001` 
`0000245` 
`001` 
`AB0001` 

我希望能夠高效地返回所有有行以用戶輸入的特定號碼結尾的標識符。例如,當用戶進入1然後將下面的行應返回: 0000001 001 AB0001

的問題是,使用WHERE Identifier LIKE CONCAT(N'%', @UserInput)使用索引掃描,其不能很好地擴展,因爲表具有噸的行在它(數以百萬計)

我應該如何有效地查詢這些數據?我首先想到的是添加表示標識符列的REVERSE()一個新列,然後用WHERE ReversedIdentifier LIKE CONCAT(REVERSE(@UserInput), N'%')找到使用比賽「開始與」

這似乎並不像乾淨的解決方案,但它就是我現在可以想到。有沒有更好的辦法?

+3

如果用戶輸入' 「5」','應該被0000245'發現?如果用戶輸入「」245「'也應該找到它? – Bohemian

+0

接受的答案,可能沒有太大的幫助。尋找全文索引 – TheGameiswar

+3

我不確定你爲什麼接受這個答案。更好的方法是創建一個具有「REVERSE(標識符)」的計算列。 SQL Server中的計算列可以被索引。然後,你可以LIKE CONCAT(@UserInput,N '%')'計算列 – cha

回答

2

如果您有一個包含數字組件的列,並且該列是一個數字,並且在索引中使用該列,那麼該列將快得多。

+0

嘿運行正常'。不知道爲什麼我沒有想到這一開始。謝謝。 – Ben

+1

這不起作用,除非輸入的數字限制爲1位。如果沒有,考慮'000123',如果用戶輸入'3','23'或'123'應該可以找到。這個「解決方案」是適當解決方案的退化邊緣案例。 – Bohemian

+0

「以用戶輸入的特定號碼結尾的標識符。」意味着它可以處理大於10的數字。問題不是要求字符串中的數字。數字本身是根據這個問題的關鍵決定因素。 –

相關問題