mysql数组在Where子句中?

时间:2019-03-21 18:18:23

标签: mysql sql

我有一个文本文件,其中包含约300行,每行包含邮政编码的前3个字符。像这样

M2X
I5D
T8I
O0P
K6R

我正在寻找在查询Where子句中使用此列表的最佳方法,以匹配表中前3位数字的表中的所有记录。

如何准备txt文件,然后创建一个数组,然后在Where中使用它

更新我的答案:

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

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

1 个答案:

答案 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