动态选择SQL中以2020开头的列及逆透视操作方法咨询
SQL原生语法不支持直接用通配符筛选指定前缀的列查询,你需要通过动态SQL拼接列名的方式实现需求,具体操作如下:
操作步骤(以SQL Server为例,其他数据库仅需调整动态SQL语法即可)
- 首先拼接所有
2020开头的列名为逗号分隔的字符串
DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX) -- 拼接符合要求的列名,自动添加引号转义 SELECT @cols = STUFF((SELECT ',' + QUOTENAME(COLUMN_NAME) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '替换为你的实际表名' AND COLUMN_NAME LIKE '2020%' FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'')
- 仅查询所有2020开头的列:直接拼接SELECT语句执行动态SQL
SET @query = 'SELECT ' + @cols + ' FROM 替换为你的实际表名' EXEC sp_executesql @query;
- 直接完成UNPIVOT转长表需求(一步到位):
SET @query = 'SELECT 你要保留的非日期列名, 日期, 数值 FROM ( SELECT 你要保留的非日期列名, ' + @cols + ' FROM 替换为你的实际表名 ) 临时表别名 UNPIVOT ( 数值 FOR 日期 IN (' + @cols + ') ) 转置后别名' EXEC sp_executesql @query;
注意事项
- 代码中所有中文占位符都需要替换为你实际的表名、字段名
- 所有要转置的2020开头的列存储的数值类型需要保持一致,否则UNPIVOT会报错
- 注意防范SQL注入风险,不要在外部输入可控的场景下直接使用未做校验的动态SQL逻辑
内容的提问来源于stack exchange,提问作者Newbie
相关产品推荐
相关产品推荐

