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

SQL如何将conversion列斜杠分隔字符串按属性拆分为多列

问题原因

你之前的写法只返回单个字符的核心问题是'[^\/]'正则仅匹配单个非斜杠字符,所以只取到了source值的首字母。

正确实现方案

默认适配PostgreSQL(你当前用到的split_part是PG原生函数),提供两种适配不同场景的写法:

方案1:正则提取(写法最简洁)

直接用substring的正则捕获组匹配对应属性的值,规则是匹配/属性名:后面到下一个斜杠/字符串末尾的所有内容,匹配不到属性时会自动返回NULL,也不限制属性的出现顺序,完全符合需求:

SELECT
  split_part(a."conversion", '/', 1)  as id,
  split_part(a."conversion", '/', 2) as brand,
  split_part(a."conversion", '/', 3) as code,
  substring(a."conversion" FROM '/source:([^/]*)') as source,
  substring(a."conversion" FROM '/campaign:([^/]*)') as campaign,
  substring(a."conversion" FROM '/content:([^/]*)') as content,
  substring(a."conversion" FROM '/term:([^/]*)') as term,
  substring(a."conversion" FROM '/medium:([^/]*)') as medium
FROM your_table a

方案2:拆成键值对后聚合(适合属性非常多的场景)

如果后续属性数量不固定,可以先把字符串拆成单个键值对,再行转列提取,扩展性更强:

WITH split_kv AS (
  SELECT
    split_part(a."conversion", '/', 1)  as id,
    split_part(a."conversion", '/', 2) as brand,
    split_part(a."conversion", '/', 3) as code,
    -- 拆分所有斜杠分隔的片段
    unnest(string_to_array(a."conversion", '/')) as kv_str
  FROM your_table a
  -- 过滤掉前三个固定字段
  WHERE kv_str NOT IN (split_part(a."conversion", '/', 1), split_part(a."conversion", '/', 2), split_part(a."conversion", '/', 3))
),
kv_parse AS (
  SELECT
    id,brand,code,
    split_part(kv_str, ':', 1) as k,
    split_part(kv_str, ':', 2) as v
  FROM split_kv
)
SELECT
  id,brand,code,
  max(v) FILTER (WHERE k = 'source') as source,
  max(v) FILTER (WHERE k = 'campaign') as campaign,
  max(v) FILTER (WHERE k = 'content') as content,
  max(v) FILTER (WHERE k = 'term') as term,
  max(v) FILTER (WHERE k = 'medium') as medium
FROM kv_parse
GROUP BY id,brand,code

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 15:24:01