массив mysql в предложении Where?

#mysql #sql

#mysql #sql

Вопрос:

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

 M2X
I5D
T8I
O0P
K6R
  

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

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

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

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

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

Комментарии:

1. Какой язык на стороне сервера вы используете?

2. что вы имеете в виду под языком на стороне сервера?

3. На самом деле я просто имел в виду язык программирования. У Билла лучший подход, но сначала вам нужно будет поместить все ваши почтовые индексы в строку.

4. Я использую powershell для преобразования моего списка

Ответ №1:

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

Вы бы хотели, чтобы это выглядело как:

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

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

 sed -e "s/.*/'amp;'/" 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 почтовых кодов (с % подстановочным знаком в конце) во временную таблицу и выполнить это с помощью объединения:

 SELECT ...
FROM mytable JOIN tmp_post_codes
  ON post_code LIKE post_code_pattern
  

Комментарии:

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

2. разобрался where postal_code regexp '^[M2X|I5D|T8I|.....]' или where postal_code rlike '^[M2X|I5D|T8I|.....]'

3. Приятно знать, что есть несколько способов сделать это