#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. Приятно знать, что есть несколько способов сделать это