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;
逻辑说明:
STRING_SPLIT(t.data, '&')将data列按&拆分成独立的键值对(如name=john)- 通过
CHARINDEX定位=的位置,拆分出键名(如name)和对应值(如john) 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;
逻辑说明:
CHARINDEX('name=', data)找到name=的起始位置,加5('name='的长度)得到值的起始点- 中间键(name、age)用后续
&的位置减去起始位置,再减去键的长度,得到值的长度 - 最后一个键height无后续
&,直接用字符串总长度计算值的长度
注意事项:
- 确保
data列格式固定,目标键(name/age/height)均存在,否则可能返回NULL或异常结果 - 若存在键缺失的情况,可通过
ISNULL(..., 'N/A')设置默认值
内容的提问来源于stack exchange,提问作者Azteka
相关产品推荐
相关产品推荐

