Более чистая реализация, а не использование LIKE - PullRequest
0 голосов
/ 06 декабря 2011

У меня есть таблица, которая содержит почтовые домены, разделенные точками с запятой.

Domain
------
gmail.com;googlemail.com
hotmail.com;hotmail.co.uk;live.co.uk

В настоящее время я использую следующий SQL:

SELECT [Id]
  FROM [DomainGroup]
 WHERE [Domain] LIKE '%' + (SELECT RIGHT('anemail@gmail.com', CHARINDEX('@', REVERSE('anemail@gmail.com')) - 1)) + '%'

Хотя это работает, я подумал, что, возможно, использование PATINDEX будет лучше как с точки зрения производительности, так и читабельности. Адрес электронной почты на самом деле является переменной, но я вставил его, чтобы показать, чего я пытаюсь достичь.

Ответы [ 2 ]

0 голосов
/ 07 декабря 2011

Рассматривали ли вы использование полнотекстового поиска?

После создания индекса запросы будут выглядеть следующим образом:

SELECT [Id] FROM [DomainGroup] WHERE CONTAINS ([Domain], 'gmail.com')
0 голосов
/ 06 декабря 2011

Я думаю, что выигрыш в производительности PATINDEX против LIKE в лучшем случае неоднозначный , особенно в вашем случае, учитывая, что нормализация значений с разделителями для отдельных строк в индексированном столбце даст большую производительность буст, чем все остальное.

Если вы не можете изменить дизайн и хотите использовать PATINDEX, тогда я предварительно вычислю шаблон;

declare @emaildomain varchar(128) = 'anemail@gmail.com'
set @emaildomain = '%;' + stuff(@emaildomain, 1, charindex('@', @emaildomain), '')  + ';%'

Затем используйте это в предложении where;

where patindex(@emaildomain, ';' + [Domain] + ';') > 0

(я добавил ; разделители, поэтому aaa@bbb.com не будет соответствовать aaabbb.com;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...