【问题标题】:How to generate select query for a table based on the value of another table in Oracle如何根据Oracle中另一个表的值生成一个表的选择查询
【发布时间】:2019-04-12 23:37:55
【问题描述】:

我有两张桌子 A 和 B。

表 A 的结构如下:

col1 | col2 | col3 | col4 | col5 | ....

表B只有一个多列的条目,例如(只取5个):

c1 c2 c3 c4 c5 ...
-- -- -- -- --
 1  0  1  1  0 ...

现在我想根据表 B 行的值在存储过程中动态生成查询。只选择对应值为 1 的列。

示例 1: 对于上述条目查询将如下所示:

select col1,
       col3,
       col4
from A; 

示例 2: 如果 B 中的条目如下所示

c1 c2 c3 c4 c5 ...
-- -- -- -- --
 0  0  1  1  0 ...

对于上述条目查询将如下所示:

select col3,
       col4
from A;

【问题讨论】:

    标签: oracle stored-procedures oracle11g


    【解决方案1】:

    将列存储为查找值并不是一个好的表设计。您可以使用UNPIVOT 来实现它,但必须明确列出映射。

    SELECT 
         'SELECT ' ||LISTAGG(
              CASE
                   WHEN col = 1 THEN val
              END,',') WITHIN GROUP(
              ORDER BY col
         ) ||' FROM A' as query
      FROM b UNPIVOT ( col
           FOR val
      IN ( c1 as 'COL1',
           c2 as 'COL2',
           c3 as 'COL3',
           c4 as 'COL4',
           c5 as 'COL5') );
    

    demo

    【讨论】:

    • 感谢您的回答,您还可以推荐一些针对相同类型需求的好的表格设计吗?
    • @Laxmikant :很难说出什么适合您的原始要求,因为您已经到了想要将其用作解决方案的地步。话虽如此,通常在 rdbms 中,将值存储为表的行而不是列(c1、c2、c3...等)并尽可能避免使用动态 sql 语句总是明智而高效的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-14
    • 1970-01-01
    • 2020-04-07
    • 2021-11-05
    相关资源
    最近更新 更多