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

获取SQL Server列名与对应值关联的查询实现方案

很理解你现在的需求——把匹配LINK_userTblID的单条行数据,拆成列名-对应值的键值对形式展示对吧?我给你几种不同场景下的实现方案,你可以根据你的数据库类型和实际情况选择:

方案一:静态UNION ALL拼接(适合列数固定的小表)

如果你的表结构不会经常变动,列数不多,可以直接用UNION ALL把每个列单独拆成行,手动指定列名和对应值:

-- 假设你的表名为user_table,包含列name, age, email, LINK_userTblID
SELECT 'name' AS column_name, CAST(name AS VARCHAR(MAX)) AS column_value
FROM user_table
WHERE LINK_userTblID = '你的目标ID'
UNION ALL
SELECT 'age' AS column_name, CAST(age AS VARCHAR(MAX)) AS column_value
FROM user_table
WHERE LINK_userTblID = '你的目标ID'
UNION ALL
SELECT 'email' AS column_name, CAST(email AS VARCHAR(MAX)) AS column_value
FROM user_table
WHERE LINK_userTblID = '你的目标ID'

⚠️ 注意:要把所有列的值转成统一类型(比如VARCHAR(MAX)),避免UNION ALL因为类型不兼容报错。

方案二:用UNPIVOT简化操作(支持的数据库:SQL Server、Oracle等)

如果你的数据库支持UNPIVOT语法,这是更简洁的方式,它可以直接把行转成键值对:

SELECT column_name, column_value
FROM (
    -- 先把所有列转成统一类型
    SELECT CAST(name AS VARCHAR(MAX)) AS name,
           CAST(age AS VARCHAR(MAX)) AS age,
           CAST(email AS VARCHAR(MAX)) AS email
    FROM user_table
    WHERE LINK_userTblID = '你的目标ID'
) AS source_data
UNPIVOT (
    -- 定义值的列名和列名的列名
    column_value FOR column_name IN (name, age, email)
) AS unpivoted_data;

这个方案比UNION ALL更简洁,尤其是列数较多的时候。

方案三:动态SQL适配任意表结构(适合列不固定的场景)

如果你的表结构可能变动,或者不想硬编码所有列名,可以用动态SQL自动获取列名并生成查询:

SQL Server版本:

DECLARE @column_list NVARCHAR(MAX), @sql_query NVARCHAR(MAX), @target_id VARCHAR(50) = '你的目标ID';

-- 从系统表获取所有列名(排除LINK_userTblID本身)
SELECT @column_list = STRING_AGG(QUOTENAME(column_name), ', ')
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'user_table'
  AND COLUMN_NAME != 'LINK_userTblID';

-- 动态拼接UNPIVOT查询语句
SET @sql_query = N'
SELECT column_name, column_value
FROM (
    SELECT ' + @column_list + '
    FROM user_table
    WHERE LINK_userTblID = @target_id
) AS source_data
UNPIVOT (
    column_value FOR column_name IN (' + @column_list + ')
) AS unpivoted_data';

-- 执行动态SQL
EXEC sp_executesql @sql_query, N'@target_id VARCHAR(50)', @target_id;

PostgreSQL版本(用JSON函数更简单):

PostgreSQL可以借助JSON函数直接把行转成键值对,不用写复杂的动态SQL:

SELECT key AS column_name, value AS column_value
FROM user_table, jsonb_each_text(to_jsonb(user_table) - 'LINK_userTblID')
WHERE LINK_userTblID = '你的目标ID';

MySQL版本(动态UNION ALL):

MySQL没有UNPIVOT,可以用动态SQL拼接UNION ALL:

SET @target_id = '你的目标ID';
SET @column_list = (
    SELECT GROUP_CONCAT(
        CONCAT("SELECT '", column_name, "' AS column_name, CAST(", column_name, " AS CHAR) AS column_value FROM user_table WHERE LINK_userTblID = '", @target_id, "'")
        SEPARATOR ' UNION ALL '
    )
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_NAME = 'user_table'
      AND COLUMN_NAME != 'LINK_userTblID'
);

PREPARE stmt FROM @column_list;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

总结

  • 列固定选方案一或二,写法简单易维护;
  • 列可能变动选方案三,自动适配表结构;
  • 不同数据库有各自的简化写法,优先用对应数据库的原生函数或语法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:23:37