SQL - поиск предложения WHERE без пробелов - PullRequest
0 голосов
/ 08 июля 2019

Я пытаюсь найти эффективное решение для поиска данных, которые поступают в приложение с удаленными символьными пространствами, но во многих отношениях могут существовать в системе БД с пробелами.Я думал о следующем, но, похоже, это не сработало:

select top 1 * where REPLACE(Mfr, ' ', '') = @Mfr and REPLACE(Model, ' ', '') = @Model

Я делаю это совершенно неправильно, и есть ли лучший способ?Похоже, что на данный момент тайм-аут только для БД с 150 тыс. Записей.

1 Ответ

1 голос
/ 08 июля 2019

Вы можете реализовать выражения в виде индексированных виртуальных столбцов для быстрого поиска.

  1. Сначала вам нужно создать виртуальные столбцы:

    alter table t add clean_mfr as replace(Mfr, ' ', '');
    
    alter table t add clean_model as replace(Model, ' ', '');
    
  2. Тогда вы их проиндексируете:

    create index ix1 on t (clean_mfr, clean_model);
    

Теперь вы можете повторить запрос. Поскольку вы используете равенство (=) в обоих поисках виртуальных столбцов, запрос должен быть мгновенным.

Попробуйте:

select top 1 * 
from t
where REPLACE(Mfr, ' ', '') = @Mfr and REPLACE(Model, ' ', '') = @Model

Или:

select top 1 * 
from t
where clean_mfr = @Mfr and clean_model = @Model
...