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

SQL如何将特殊字符分隔的单字段内容拆分为多个独立列

解决方案

核心思路:你的存储内容是标准CSV行格式,每个字段值被双引号包裹,分隔符为",",拆分时按分隔符定位对应字段的区间,再移除首尾残留的双引号即可,你之前硬编码位置的写法不通用,字段内容长度变化后就会取值错误。

以下是不同主流数据库的实现方案:

MySQL 实现

SELECT
  -- 取第一个字段
  TRIM(BOTH '"' FROM SUBSTRING_INDEX(SUBSTRING_INDEX(data, '","', 1), '","', -1)) AS col1,
  -- 取第二个字段
  TRIM(BOTH '"' FROM SUBSTRING_INDEX(SUBSTRING_INDEX(data, '","', 2), '","', -1)) AS col2,
  -- 取第三个字段
  TRIM(BOTH '"' FROM SUBSTRING_INDEX(SUBSTRING_INDEX(data, '","', 3), '","', -1)) AS col3
FROM 你的表名;

逻辑说明:SUBSTRING_INDEX(data, '","', N) 会截取出前N个分隔符之前的所有内容,再取最后一段就是第N个字段的原始内容,用TRIM去掉两边的双引号即可拿到纯值。

Oracle 实现

用正则匹配直接提取对应位置的字段:

SELECT
  TRIM('"' FROM REGEXP_SUBSTR(data, '"([^"]*)"', 1, 1, NULL, 1)) AS col1,
  TRIM('"' FROM REGEXP_SUBSTR(data, '"([^"]*)"', 1, 2, NULL, 1)) AS col2,
  TRIM('"' FROM REGEXP_SUBSTR(data, '"([^"]*)"', 1, 3, NULL, 1)) AS col3
FROM 你的表名;

PostgreSQL 实现

先转数组再按序号取值:

SELECT
  trim('"' FROM (string_to_array(data, '","'))[1]) AS col1,
  trim('"' FROM (string_to_array(data, '","'))[2]) AS col2,
  trim('"' FROM (string_to_array(data, '","'))[3]) AS col3
FROM 你的表名;

SQL Server 实现(2016及以上版本支持)

WITH split_data AS (
  SELECT 
    data,
    value,
    ROW_NUMBER() OVER (PARTITION BY data ORDER BY (SELECT NULL)) AS rn
  FROM 你的表名
  CROSS APPLY STRING_SPLIT(data, '","')
)
SELECT
  TRIM('"' FROM MAX(CASE WHEN rn = 1 THEN value END)) AS col1,
  TRIM('"' FROM MAX(CASE WHEN rn = 2 THEN value END)) AS col2,
  TRIM('"' FROM MAX(CASE WHEN rn = 3 THEN value END)) AS col3
FROM split_data
GROUP BY data;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 02:24:04