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

如何用动态SQL按列前缀对SQL表执行Unpivot操作

问题描述

现有从JSON文档错误导入的SQL表,结构如下:

X1AB_name     X1AB_age        Y2AL_name       Y2AL_age
"Todd"        10              "Brad"          20

需要按列名中下划线前的前缀进行逆透视(Unpivot),期望得到结果:

id              name         age
"X1AB"          "Todd"        10
"Y2AL"          "Brad"        20

是否可以通过动态SQL实现?

动态SQL实现方案

可以用动态SQL实现,核心思路是先提取所有列名的前缀(下划线前的部分),再针对每个前缀拼接对应的name和age列,最后组合成逆透视查询语句。

以下是SQL Server环境下的实现代码:

DECLARE @sql NVARCHAR(MAX) = '';

-- 提取所有唯一的前缀(下划线前的部分)
WITH ColumnPrefixes AS (
    SELECT DISTINCT 
        LEFT(name, CHARINDEX('_', name) - 1) AS Prefix
    FROM sys.columns 
    WHERE object_id = OBJECT_ID('YourTableName') -- 替换为你的实际表名
      AND (name LIKE '%[_]name' OR name LIKE '%[_]age')
)
-- 拼接每个前缀对应的查询片段
SELECT @sql += N'
SELECT 
    ''' + Prefix + ''' AS id,
    ' + QUOTENAME(Prefix + '_name') + ' AS name,
    ' + QUOTENAME(Prefix + '_age') + ' AS age
FROM YourTableName -- 替换为你的实际表名
UNION ALL'
FROM ColumnPrefixes;

-- 移除末尾多余的UNION ALL
SET @sql = LEFT(@sql, LEN(@sql) - LEN('UNION ALL'));

-- 执行动态SQL
EXEC sp_executesql @sql;

注意事项

  • 务必将代码中的YourTableName替换为你的目标表名
  • 代码会自动识别所有符合前缀_name和前缀_age格式的列,无需手动指定前缀
  • 若使用其他数据库(如MySQL),需调整系统表和字符串函数:比如用INFORMATION_SCHEMA.COLUMNS替代sys.columns,用SUBSTRING_INDEX(name, '_', 1)提取前缀

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 10:20:12