字符串结尾的通配符匹配的索引

时间:2010-05-11 11:10:12

标签: sql-server indexing

我有一个电话号码表,将电话号码存储为varchar(20)。我要求实现对整个数字的搜索,但也只是对数字的最后部分进行搜索,因此典型的查询将是:

SELECT * FROM PhoneNumbers WHERE Number LIKE '%1234'

如何在Number列上添加索引以使这些搜索更有效?有没有办法创建一个索引来对反向字符串上的记录进行排序?另一种选择可能是在存储它们之前反转数字,这将提供如下查询:

SELECT * FROM PhoneNumbers WHERE ReverseNumber LIKE '4321%'

但是,这将要求数据库的所有用户始终反转字符串。它可以通过存储正常数字和反向数字并通过插入/更新时的触发器更新反转数字来解决。但这种解决方案并不是很优雅。

还有其他建议吗?

2 个答案:

答案 0 :(得分:4)

ALTER TABLE phonenumbers ADD reverse_number AS REVERSE(number) PERSISTED

CREATE INDEX ix_phonenumbers_reversenumber ON phonenumbers (reverse_number)

SELECT  *
FROM    phonenumbers
WHERE   reverse_number LIKE '4321%'

答案 1 :(得分:2)

除非用户手动执行查询,否则您不需要让用户反向,您可以使用计算列而不是触发器:

CREATE TABLE TBL (TEL VARCHAR(20) NOT NULL)
ALTER TABLE TBL ADD TEL_REV AS REVERSE(TEL)
CREATE NONCLUSTERED INDEX IX_REVERSETEL ON TBL (TEL_REV) INCLUDE (TEL)

INSERT TBL SELECT '12345678'
    UNION SELECT '147258369'
    UNION SELECT '963852741'

--find nums ending in 5678
SELECT * FROM TBL WHERE TEL_REV LIKE REVERSE('5678') + '%' /*index seek*/