【问题标题】:Convert SQL single row multiple column output to two column(key, value) and multiple row output将SQL单行多列输出转换为两列(key, value)多行输出
【发布时间】:2020-03-26 15:37:00
【问题描述】:

SQL 输出:单行多列

示例:用户表 SQL: select * from jiuser limit 1

现在我需要将输出转换为键值格式,我将得到 2 列和多行。

【问题讨论】:

  • 这里的大多数人都希望样本表数据和预期结果为格式化文本,而不是图像。
  • 这是一个随机样本,你可以使用任何表,如员工、学生等。我的实际数据和查询是不同的。
  • SQL 无法将列转置为行。这在概念上也是错误的,因为每个新的键/值行都将与原始唯一行 id(可能是几个组合在一起的字段)解除关联。至少,您需要为每个新行重复唯一的行 ID,以便最终得到 ID | KEY | VALUE。我认为实现这一点最简单的方法是编写一个简短的脚本(Python、Lua 等)。
  • 我需要直接使用查询,因此不能在两者之间使用任何东西。
  • 您是否看到我们可以使用结果集元数据来实现这一目标?

标签: sql postgresql unpivot


【解决方案1】:

您可以使用横向连接:

select v.*
from t cross join lateral
     (values ('username', username),
             ('tenantid', tenantid::text),
             ('fullname', fullname)
     ) v(key, value);

【讨论】:

  • 我不能使用任何硬编码,因为这只是一个示例,我的实际查询中有大约 200 多列。
【解决方案2】:

我建议您考虑本文中的选项: https://www.sqlshack.com/multiple-options-to-transposing-rows-into-columns/

您也可以考虑开发表变量并使用游标更新它

DECLARE @tempTable TABLE (k varchar(200), v varchar(max))

INSERT INTO @tempTable
    SELECT C.name, '' FROM sys.objects O
    INNER JOIN sys.columns C ON O.object_id = C.object_id
    WHERE O.name = 'STOKLAR' AND O.type_desc = 'USER_TABLE'

-- CURSOR , CAST AS VARCHAR AND UPDATE CODE HERE 

SELECT * FROM @tempTable

【讨论】:

    【解决方案3】:

    如果你想要一个动态的 unpivot,你可以使用 Postgres 的 JSON 函数:

    select c.column_name, c.value
    from jiuser j
      cross join lateral jsonb_each_text(to_jsonb(j)) as t(column_name, value);
    

    【讨论】:

      【解决方案4】:

      您可以使用一系列UNION ALL 操作数来实现您正在寻找的结果。但是,请注意,值列都必须是相同的数据类型,UNION ALLs 才能工作。比如:

      DECLARE @ID int = 1;
      
      SELECT 'id' as FIELD_LABEL,
             CONVERT(varchar(500), id) AS FIELD_VALUE
        FROM jiuser
       WHERE id = @ID
      
      UNION ALL
      
      SELECT 'Username' as FIELD_LABEL,
             CONVERT(varchar(500), username) AS FIELD_VALUE
        FROM jiuser
       WHERE id = @ID
      
      UNION ALL
      
      SELECT 'TeneantID' as FIELD_LABEL,
             CONVERT(varchar(500), tenantid) AS FIELD_VALUE
        FROM jiuser
       WHERE id = @ID
      

      不断地不断地。 . .

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-07
        • 1970-01-01
        • 1970-01-01
        • 2020-07-01
        • 2019-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多