2010-05-11 50 views
3

我有一个电话号码表,将电话号码存储为varchar(20)。我要实现两个全数字的搜索要求,但也只在号码的最后一部分,所以一个典型的查询将是:字符串结尾的通配匹配索引

SELECT * FROM PhoneNumbers WHERE Number LIKE '%1234' 

我怎样才能把一个索引上Number列,使这些搜索效率高?有没有办法创建一个索引来排序反转字符串上的记录?另一种选择可能是将它们存储之前扭转号码,这将给像查询:

SELECT * FROM PhoneNumbers WHERE ReverseNumber LIKE '4321%' 

然而这将需要对数据库的所有用户随时逆转的字符串。它可以通过存储正常和反转数字并通过插入/更新触发器更新相反数字来解决。但那种解决方案并不是很优雅。

其他建议?

+1

看看这个答案:HTTP:/ /stackoverflow.com/questions/1537645/in-the-beginning-of-like-clause/1537706#1537706 – 2010-05-11 11:36:04

回答

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%' 
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*/ 
相关问题