【问题标题】:change the query to return categorized output更改查询以返回分类输出
【发布时间】:2022-01-06 02:11:24
【问题描述】:

我有一个这样的查询:

select * from my_table;

结果如下:

name       x1    x2    x3
----       ---- ---   ---
data       -2    3      -1

我想更改查询以将正负输出分成单独的行,结果更改为:

name       x1    x2    x3
----       ---- ---   ---
data       -2    3      -1
data       -2    null   -1
data       null  3      null

【问题讨论】:

  • 对每个单独的列使用 CASE,对 2 个查询使用 UNION ALL - 一个只选择负值,另一个只选择非负(正或零)值。
  • 谢谢,但我的真实查询太长,我不想使用联合。 @Akina
  • 但我的真实查询太长,我不想使用联合将您的查询放到 CTE 中,然后在 UNION ALL 中重用它。
  • MySQL和Oracle是两个独立的RDBMS;你用的是哪个?
  • 我使用Oracle数据库

标签: sql oracle oracle11g


【解决方案1】:
   SELECT *
    FROM   my_Table
    SELECT name,
           CASE WHEN x1 < 0 THEN x1 else Null END,
           CASE WHEN x2 < 0 THEN x2 else Null END,
           CASE WHEN x3 < 0 THEN x3 else Null END
    FROM   my_Table
    UNION ALL
    SELECT name,
           CASE WHEN x1 >= 0 THEN x1 else Null END,
           CASE WHEN x2 >= 0 THEN x2 else Null END,
           CASE WHEN x3 >= 0 THEN x3 else Null END
    FROM   my_Table;

【讨论】:

    【解决方案2】:

    如果您的查询比较复杂,可以将其放入子查询分解 (WITH) 子句中,然后使用 UNION ALLCASE 表达式:

    WITH your_query (name, x1, x2, x3) AS (
      select * from my_table
    )
    SELECT *
    FROM   your_query
    UNION ALL
    SELECT name,
           CASE WHEN x1 < 0 THEN x1 END,
           CASE WHEN x2 < 0 THEN x2 END,
           CASE WHEN x3 < 0 THEN x3 END
    FROM   your_query
    UNION ALL
    SELECT name,
           CASE WHEN x1 >= 0 THEN x1 END,
           CASE WHEN x2 >= 0 THEN x2 END,
           CASE WHEN x3 >= 0 THEN x3 END
    FROM   your_query;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-04
      • 1970-01-01
      • 2011-07-13
      • 2019-04-19
      • 1970-01-01
      • 2021-04-13
      • 2016-12-19
      • 1970-01-01
      相关资源
      最近更新 更多