You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用单条SQL查询匹配逗号分隔字符串中指定值的所有行

解决方案

方案1:使用IN子句 + 动态参数绑定(推荐,性能最优)

IN子句天然支持匹配值是否属于指定集合,我们可以根据拆分后的数组长度动态生成对应数量的占位符,绑定参数后执行即可,完全规避SQL注入风险,且只执行一次查询。

$comaSeperatedString = "A0007,A0008,A0009,A0010,A0011,A0012";
$col1_arr = explode(",", $comaSeperatedString);
// 生成和数组元素数量匹配的?占位符
$placeholders = rtrim(str_repeat('?,', count($col1_arr)), ',');
// 预处理SQL,注意data是SQL关键字,需要用反引号包裹
$sqlData = $this->con->prepare("SELECT col1, col2, col3 FROM `data` WHERE col1 IN ($placeholders)");
// 绑定参数并执行
$sqlData->execute($col1_arr);
// 批量获取所有结果
$res = $sqlData->fetchAll(PDO::FETCH_ASSOC);
// 遍历输出
foreach ($res as $item) {
    echo $item['col1'];
    echo $item['col2'];
    echo $item['col3'];
}

优点:

  • 性能高,仅执行1次查询,col1建索引的情况下查询效率拉满
  • 安全,参数绑定完全规避SQL注入风险
  • 适配任意长度的逗号分隔字符串

方案2:使用FIND_IN_SET函数(代码更简洁)

MySQL等主流数据库内置FIND_IN_SET函数,语法为FIND_IN_SET(目标列, 逗号分隔字符串),匹配成功返回大于0的整数,否则返回0,无需提前拆分字符串。

$comaSeperatedString = "A0007,A0008,A0009,A0010,A0011,A0012";
$sqlData = $this->con->prepare("SELECT col1, col2, col3 FROM `data` WHERE FIND_IN_SET(col1, ?) > 0");
$sqlData->execute([$comaSeperatedString]);
$res = $sqlData->fetchAll(PDO::FETCH_ASSOC);

注意:该写法更简洁,但无法利用col1的索引,数据量较大时性能低于方案1,适合小数据量场景使用。

内容的提问来源于stack exchange,提问作者EL_EL

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 04:06:07