我有一个文本文件,其中包含约300行,每行包含邮政编码的前3个字符。像这样
M2X
I5D
T8I
O0P
K6R
我正在寻找在查询Where
子句中使用此列表的最佳方法,以匹配表中前3位数字的表中的所有记录。
如何准备txt文件,然后创建一个数组,然后在Where
中使用它
更新我的答案:
WHERE POST regexp '^(M2X|I5D|T8I|.....)'
WHERE POST rlike '^(M2X|I5D|T8I|.....)'
答案 0 :(得分:1)
您可能要为此使用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