SQL select命令使用带逗号分隔ID的字符串

时间:2014-09-02 05:58:24

标签: php mysql sql select wildcard

我在PHP中有一个字符串,如:

"1234,2345,4567,5676,234,12,78957".....

我想以varchar(30)格式提取这些数字,并在像

这样的命令上使用它们
SELECT * FROM TABLE_NUM WHERE ID LIKE '%NUM';

其中NUM将具有上述7个字符串。

如果可能,我还想限制'%'在'%NUM'仅限1-5个字符,即前缀不应超过5个字符。示例NUM = 1234且ID具有(31234,5678956781234)它应该仅提供第一个作为结果而不是另一个。

因此,我将获得所有匹配行的合并结果。

我怎样才能做到这一点?

谢谢!

1 个答案:

答案 0 :(得分:2)

如果该字符串来自数据库中的某个列,则应修复该架构。设计一个必须处理子列数据的模式几乎总是

如果它是来自 outside 数据库的字符串,并且您只想根据各个部分运行查询,那么最好使用DBMS外部的 设施构建查询。

例如,在Linux下使用bash

pax> list="1234,2345,4567,5676,234,12,78957"
pax> for i in $(echo $list | sed 's/,/ /g'); do
...>     echo mysql "\"SELECT * FROM TABLE_NUM WHERE ID LIKE '%$i'\""
...> done
mysql "SELECT * FROM TABLE_NUM WHERE ID LIKE '%1234'"
mysql "SELECT * FROM TABLE_NUM WHERE ID LIKE '%2345'"
mysql "SELECT * FROM TABLE_NUM WHERE ID LIKE '%4567'"
mysql "SELECT * FROM TABLE_NUM WHERE ID LIKE '%5676'"
mysql "SELECT * FROM TABLE_NUM WHERE ID LIKE '%234'"
mysql "SELECT * FROM TABLE_NUM WHERE ID LIKE '%12'"
mysql "SELECT * FROM TABLE_NUM WHERE ID LIKE '%78957'"

该脚本将回显命令以执行您想要的操作(假设mysql是您的DBMS的正确CLI接口) - 只需删除开头的echo即可实际上执行命令。


对于PHP(根据您的问题编辑),您可以使用explode函数来拆分字符串,例如:

$list = "1234,2345,4567,5676,234,12,78957";
$numbers = explode (",", $list);

然后对$numbers的每个元素执行查询。


如果你所追求的是由所有这些值组成的单个结果集,还有其他方法可以做到。一个是使用列表构建一个“超级查询”字符串,它将为您完成所有工作,然后执行一次。

只需使用or子句将不同的“子”查询连接成一个(伪代码):

$query = "select * from table_num"
$joiner = " where"
for each $element in $list:
    $query = $query + $joiner + "id like '%" + $element + "'"
    $joiner = " or"
execute_sql $query

最终会为您提供查询字符串:

SELECT * FROM TABLE_NUM
    WHERE ID LIKE '%1234'
    OR    ID LIKE '%2345'
    :
    OR    ID LIKE '%78957'