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_id | kol_id |
|---|---|
| 991 | 160f7a4a-766a-4c23-a155-8bd3f7389f77 |
| 991 | 63233bfc-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
相关产品推荐
相关产品推荐

