массив mysql в предложении Where? - PullRequest
1 голос
/ 21 марта 2019

У меня текстовый файл содержит около 300 строк, каждая строка содержит первые 3 символа почтовых индексов. как это,

M2X
I5D
T8I
O0P
K6R

Я ищу лучший способ использовать этот список в предложении моего запроса Where, чтобы сопоставить все записи из таблицы, в которой первые 3 цифры находятся в этом списке.

Как мне подготовить текстовый файл, затем создать массив и использовать его в Where

Обновить мой ответ:

WHERE POST regexp '^(M2X|I5D|T8I|.....)'

WHERE POST rlike '^(M2X|I5D|T8I|.....)'

1 Ответ

1 голос
/ 21 марта 2019

Вы, вероятно, хотите использовать для этого предикат SQL IN ( ).

Вы бы хотели, чтобы это выглядело следующим образом:

WHERE post_code IN ('M2X','I5D','T8I','O0P','K6R',...)

Преобразование файла текстовых строк в этот формат можно выполнить на различных языках сценариев.Например, sed и awk:

sed -e "s/.*/'&'/" postal_codes.csv | awk 'BEGIN { ORS="," } { print }' | sed "s/,$//"
'M2X','I5D','T8I','O0P','K6R'

Если вы хотите, чтобы первые три символа ваших данных соответствовали почтовому коду, другими словами, как если бы они были префиксами, вы можете попробовать это:

WHERE LEFT(post_code, 3) IN ('M2X','I5D','T8I','O0P','K6R',...)

Недостатком является невозможность поиска по индексу.

Другой вариант - использовать сопоставление с шаблоном, которое будет использовать индекс при поиске по префиксу.Но это делает запрос довольно длинным:

WHERE post_code LIKE 'M2X%'
   OR post_code LIKE 'I5D%'
   OR post_code LIKE 'T8I%'
   OR post_code LIKE 'O0P%'
   OR post_code LIKE 'K6R%'
   OR ...

Или вы можете загрузить набор из 300 почтовых кодов (с подстановочным знаком % в конце) во временную таблицу и сделать это с помощью JOIN:

SELECT ...
FROM mytable JOIN tmp_post_codes
  ON post_code LIKE post_code_pattern
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...