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

MySQL查询中移除字符串所有反斜杠的方案问询

解决方案

问题根源

你之前用的REPLACE(json_id,'\'',"'")完全没处理反斜杠——这个语句是把单引号替换成单引号,等于没做任何操作。另外,就算去掉反斜杠,直接用IN子句也会失效,因为子查询返回的是单个逗号分隔的字符串,IN会把它当作一个整体值,而不是多个独立的ID。

方法一:用FIND_IN_SET快速匹配(适配所有MySQL版本)

先去掉反斜杠和多余的单引号,再用FIND_IN_SET检测kol_id是否在处理后的字符串中:

SELECT k.*
FROM kapp_staging.kols k
JOIN kapp_staging.news_items ni 
  ON ni.id = '991'
WHERE FIND_IN_SET(
    k.kol_id,
    REPLACE(REPLACE(ni.json_id, '\\', ''), "'", '')
) > 0;
  • REPLACE(ni.json_id, '\\', ''):去掉所有反斜杠(MySQL中反斜杠是转义字符,必须用\\表示实际的\)
  • REPLACE(..., "'", ''):去掉所有单引号,得到纯ID逗号分隔的字符串
  • FIND_IN_SET会自动检测kol_id是否在这个逗号分隔的列表里

方法二:拆分字符串为多行(MySQL 8.0+,更规范)

如果你的MySQL版本是8.0及以上,推荐把字符串拆分成独立的行记录,让IN子句正常工作:

SELECT k.*
FROM kapp_staging.kols k
WHERE k.kol_id IN (
    SELECT TRIM(BOTH '"' FROM j.kol_id)
    FROM kapp_staging.news_items ni
    JOIN JSON_TABLE(
        -- 把处理后的字符串转成JSON数组格式
        CONCAT('["', REPLACE(REPLACE(ni.json_id, '\\', ''), "'", '","'), '"]'),
        '$[*]' COLUMNS(kol_id VARCHAR(36) PATH '$')
    ) j
    WHERE ni.id = '991'
);

这个方法先把字符串转换成JSON数组,再用JSON_TABLE拆分成多行ID,完美适配IN子句的逻辑。

长期优化建议

把多个ID存在单个字符串字段里是反数据库范式的设计,会导致查询效率低、维护麻烦。建议新建一个关联表news_items_kols,结构如下:

news_item_idkol_id
991160f7a4a-766a-4c23-a155-8bd3f7389f77
99163233bfc-b663-4c73-890b-00a48d79c4dc

之后查询直接用关联查询,无需任何字符串处理:

SELECT k.*
FROM kapp_staging.kols k
JOIN news_items_kols nik ON k.kol_id = nik.kol_id
WHERE nik.news_item_id = '991';

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 03:01:00