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

如何用SQL处理COMMENTS表 将同一ID的拼接评论拆分为独立行

退订原因字段拆分方案

前置说明

你的示例中拼接后的原因无明显分隔符,属于不规范的存储逻辑,以下方案默认你实际存储时使用了不会出现在原因文本中的特殊分隔符(如|、^等),可直接替换方案中的分隔符即可适配。如果你确实没有加分隔符,可以参考文末特殊场景的处理方案。

不同数据库实现代码

MySQL 8.0+

WITH RECURSIVE split_result AS (
    SELECT
        IDS,
        COMMENTS AS all_comments,
        1 AS index_num,
        -- 截取第一个原因
        SUBSTRING_INDEX(COMMENTS, '|', 1) AS single_comment,
        -- 剩余未拆分的内容
        SUBSTRING(COMMENTS, LENGTH(SUBSTRING_INDEX(COMMENTS, '|', 1)) + 2) AS left_comments
    FROM 你的表名
    WHERE COMMENTS IS NOT NULL AND COMMENTS <> ''
    UNION ALL
    SELECT
        IDS,
        all_comments,
        index_num + 1,
        SUBSTRING_INDEX(left_comments, '|', 1),
        SUBSTRING(left_comments, LENGTH(SUBSTRING_INDEX(left_comments, '|', 1)) + 2)
    FROM split_result
    WHERE left_comments IS NOT NULL AND left_comments <> ''
)
SELECT IDS, single_comment AS COMMENTS
FROM split_result
ORDER BY IDS, index_num;

PostgreSQL

直接使用内置拆分函数即可,代码最简单:

SELECT
    IDS,
    unnest(string_to_array(COMMENTS, '|')) AS COMMENTS
FROM 你的表名;

SQL Server 2016及以上

使用内置STRING_SPLIT函数实现:

SELECT
    t.IDS,
    s.value AS COMMENTS
FROM 你的表名 t
CROSS APPLY STRING_SPLIT(t.COMMENTS, '|') s

Oracle

SELECT
    IDS,
    REGEXP_SUBSTR(COMMENTS, '[^|]+', 1, LEVEL) AS COMMENTS
FROM 你的表名
CONNECT BY REGEXP_SUBSTR(COMMENTS, '[^|]+', 1, LEVEL) IS NOT NULL
AND PRIOR IDS = IDS
AND PRIOR SYS_GUID() IS NOT NULL;

无分隔符特殊场景处理

如果你的存储逻辑确实是直接拼接原因没有加分隔符,建议先枚举所有可选退订原因存入配置表reason_config(reason_text),再通过模糊关联实现拆分:

-- 以PostgreSQL为例,其他数据库语法仅需修改拼接符即可
SELECT
    t.IDS,
    r.reason_text AS COMMENTS
FROM 你的表名 t
INNER JOIN reason_config r 
    ON STRPOS(t.COMMENTS, r.reason_text) > 0

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 22:18:04