Индекс для подстановочного совпадения конца строки - PullRequest
3 голосов
/ 11 мая 2010

У меня есть таблица телефонных номеров с сохранением номера телефона как varchar (20). У меня есть требование реализовать поиск по обоим целым числам, но также и по последней части числа, поэтому типичный запрос будет:

SELECT * FROM PhoneNumbers WHERE Number LIKE '%1234'

Как поместить индекс в столбец Number, чтобы сделать этот поиск эффективным? Есть ли способ создать индекс, который сортирует записи по перевернутой строке? Другой вариант может состоять в том, чтобы поменять числа перед их сохранением, что приведет к следующим запросам:

SELECT * FROM PhoneNumbers WHERE ReverseNumber LIKE '4321%'

Однако это потребует от всех пользователей базы данных всегда переворачивать строку. Эту проблему можно решить, сохранив как нормальное, так и обратное число и обновив обратный номер триггером при вставке / обновлении. Но такое решение не очень элегантно.

Любые другие предложения?

Ответы [ 2 ]

4 голосов
/ 11 мая 2010
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 голосов
/ 11 мая 2010

Вам не нужно, чтобы пользователи обращались вспять, если они не выполняют запрос вручную, и вы можете использовать вычисляемый столбец, а не триггер:

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*/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...