2016-12-05 57 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的数字。问题不是要求字符串中的数字。数字本身是根据这个问题的关键决定因素。 –

相关问题