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

Azure SQL Database中如何基于特定主键从现有列生成新列?

在Azure SQL Database中从字符串列提取键值生成新列

针对你的需求,这里提供两种基于Azure SQL支持的函数(STRING_SPLIT、CHARINDEX、SUBSTRING)的解决方案,无需正则:

方法一:使用STRING_SPLIT + PIVOT

先拆分字符串为键值对,再通过透视转换为目标列:

SELECT 
    id,
    data,
    [name] AS name,
    [age] AS age,
    [height] AS height
FROM (
    SELECT 
        t.id,
        t.data,
        -- 拆分单个键值对为key和value
        LEFT(s.value, CHARINDEX('=', s.value) - 1) AS key_name,
        SUBSTRING(s.value, CHARINDEX('=', s.value) + 1, LEN(s.value)) AS key_value
    FROM your_table t
    CROSS APPLY STRING_SPLIT(t.data, '&') s
) AS key_value_pairs
PIVOT (
    MAX(key_value)
    FOR key_name IN ([name], [age], [height])
) AS pivot_result;

逻辑说明:

  1. STRING_SPLIT(t.data, '&') 将data列按&拆分成独立的键值对(如name=john)
  2. 通过CHARINDEX定位=的位置,拆分出键名(如name)和对应值(如john)
  3. PIVOT将行格式的键值对转换为列,MAX聚合确保每个id对应的键只返回一个有效值

方法二:纯用CHARINDEX和SUBSTRING直接提取

如果不想用拆分和透视,可直接定位每个键的位置提取值:

SELECT 
    id,
    data,
    -- 提取name值
    SUBSTRING(
        data,
        CHARINDEX('name=', data) + 5,
        CHARINDEX('&', data, CHARINDEX('name=', data)) - CHARINDEX('name=', data) - 5
    ) AS name,
    -- 提取age值
    SUBSTRING(
        data,
        CHARINDEX('age=', data) + 4,
        CHARINDEX('&', data, CHARINDEX('age=', data)) - CHARINDEX('age=', data) - 4
    ) AS age,
    -- 提取height值(最后一个键无后续&,用LEN(data)计算长度)
    SUBSTRING(
        data,
        CHARINDEX('height=', data) + 7,
        LEN(data) - CHARINDEX('height=', data) - 6
    ) AS height
FROM your_table;

逻辑说明:

  1. CHARINDEX('name=', data)找到name=的起始位置,加5('name='的长度)得到值的起始点
  2. 中间键(name、age)用后续&的位置减去起始位置,再减去键的长度,得到值的长度
  3. 最后一个键height无后续&,直接用字符串总长度计算值的长度

注意事项:

  • 确保data列格式固定,目标键(name/age/height)均存在,否则可能返回NULL或异常结果
  • 若存在键缺失的情况,可通过ISNULL(..., 'N/A')设置默认值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 04:05:18