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

MySQL如何将单字段查询结果行转置为多列输出(不使用变量)

纯SELECT实现行转置方案

以下方案均不使用临时变量,仅靠SQL内置功能实现:

通用ANSI SQL方案(支持所有带窗口函数的数据库,返回单行多列结果)

SELECT 
    MAX(CASE WHEN rn = 0 THEN column_name END) AS T0,
    MAX(CASE WHEN rn = 1 THEN column_name END) AS T1,
    MAX(CASE WHEN rn = 2 THEN column_name END) AS T2,
    MAX(CASE WHEN rn = 3 THEN column_name END) AS T3,
    MAX(CASE WHEN rn = 4 THEN column_name END) AS T4,
    MAX(CASE WHEN rn = 5 THEN column_name END) AS T5,
    MAX(CASE WHEN rn = 6 THEN column_name END) AS T6
FROM (
    SELECT 
        column_name, 
        ROW_NUMBER() OVER (ORDER BY ordinal_position) - 1 AS rn
    FROM information_schema.columns 
    WHERE table_name = 'volumestest'
) AS temp;

实现逻辑:

  • 子查询通过ROW_NUMBER窗口函数给每个列名按表结构的原始顺序生成从0开始的序号
  • 外层通过条件聚合把对应序号的列名提取为单独的字段,最终返回单行7列的结果

各数据库拼接输出|T0|T1|T2|T3|T4|T5|T6|格式字符串的方案

MySQL / MariaDB

SELECT CONCAT('|', GROUP_CONCAT(column_name ORDER BY ordinal_position SEPARATOR '|'), '|') AS transpose_result
FROM information_schema.columns 
WHERE table_name = 'volumestest';

PostgreSQL

SELECT '|' || STRING_AGG(column_name, '|' ORDER BY ordinal_position) || '|' AS transpose_result
FROM information_schema.columns 
WHERE table_name = 'volumestest';

SQL Server

SELECT '|' + STRING_AGG(column_name, '|') WITHIN GROUP (ORDER BY ordinal_position) + '|' AS transpose_result
FROM information_schema.columns 
WHERE table_name = 'volumestest';

Oracle

SELECT '|' || LISTAGG(column_name, '|') WITHIN GROUP (ORDER BY column_id) || '|' AS transpose_result
FROM user_tab_columns 
WHERE table_name = 'VOLUMESTEST';

注:Oracle默认表名以大写存储,查询时需要匹配大小写,否则会返回空结果


内容的提问来源于stack exchange,提问作者François Maurice

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 23:06:04