Как найти наименьшее количество шаблонов LIKE, чтобы удовлетворить список строк - PullRequest
0 голосов
/ 05 февраля 2019

Допустим, у меня есть этот список строк в файле Excel:

33000
33100
33010
33110
45050
45150
45250
45350
45360
45370
55360
55370

И у меня есть таблица SQL, в которой есть этот список строк и многое другое, и я хочу сделать оператор SELECTкоторый ищет только этот список строк.

Я мог бы сделать заявление грубой силы наподобие SELECT * FROM Table WHERE field = '33100' OR field = '33010' ....Тем не менее, я мог бы сделать список WHERE меньшим, используя операторы LIKE.

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

33[01][01]0
45[0123]50
[45]53[67]0

Как я могу динамически генерировать список таких шаблонов, когда входными данными является список строк?

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019
  1. Хорошо, допустим, у вас есть эти данные в Excel, которые начинаются с ячейки A2

  2. В ячейке C1 введите этот код: create table ##TEMP(STRS varchar(20))

  3. В ячейке C2 напишите этот код: ="insert into ##TEMP"&" values"&" ('"&A2&"' )"&","

  4. В ячейке C3 напишите этот код: =" ('"&A3&"') "&", "

  5. Теперь нажмите Ctrl + C в ячейке C3 и вставьте ее в диапазон C4-C13

enter image description here

Теперь вы получаете Excel вот так

enter image description here

Скопируйте этот код в диапазоне C1-C13, откройте SQL Management Studio, вставьте его, удалите последнюю запятую (в этом случае в ячейке C13 в конце есть запятая, которую необходимо удалить для успешного запуска SQL) и запустите, теперь ву вас есть ##temp таблица.

INNER JOIN это с вашей таблицей, как

SELECT * FROM MYTABLE M INNER JOIN ##TEMP AS T ON T.STRS = M.COLUMN_NAME_STR

И вы должны получить данныечто вам нужно, надеюсь, это поможет.

0 голосов
/ 05 февраля 2019

Альтернативный подход может быть более «элегантным», но он не будет быстрее.Ваши строки начинаются с разных символов, поэтому первая часть шаблона like будет подстановочным знаком или диапазоном символов, что фактически исключает использование индекса.

Простое выражение in, с другойрука, можно использовать индекс:

where col in ('33100', '33010', '33110', '45050', ...)
...