如何用单条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
相关产品推荐
相关产品推荐

