2010-05-11 4 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 –

답변

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*/