【问题标题】:How to select column values based on condition in OracleOracle中如何根据条件选择列值
【发布时间】:2018-10-03 16:54:56
【问题描述】:

我有一张要从中生成报告的表格。我可以传递参数值来调用另一个使用查询填充数据的报告。数据应该根据我们传入的参数进行更改,其中列值是根据参数值选择的

这是我的示例输入和基于参数的预期输出。

输入表

id_val      name    flag_1   f1_val     flag_2   f2_val     flag_3   f3_val
1           USD      1          aa         0        gg            1    mm
2           CAD      0          bb         0        hh            0    nn
3           INR      1          cc         1        ii            0    oo
4           JPY      0          dd         1        jj            1    pp
5           EUR      1          ee         1        kk            1    qq
6           AUD      1          ff         1        ll            0    rr

基于参数值的输出

如果参数 = 标志 1

name    flag   f_val
USD     1       aa
INR     1       cc
EUR     1       ee
AUD     1       ff

如果参数 = Flag2

name    flag  f_val
INR     1      ii
JPY     1      jj
EUR     1      kk
AUD     1      ll

如果参数 = Flag3

name    flag   f_val
USD     1       mm
JPY     1       pp
EUR     1       qq

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    您可以轻松干净地使用 decode :

    select name,1 as flag,
                decode('&Parameter','Flag1',F1_val
                                   ,'Flag2',F2_val
                                   ,'Flag3',F3_val) as f_val
      from tab
     where decode('&Parameter','Flag1',Flag_1 
                              ,'Flag2',Flag_2
                              ,'Flag3',Flag_3) = 1;
    

    假设 '&Parameter' 是一个字符串类型替换变量,可能会为其传递值 'Flag1''Flag2''Flag3'

    -- if '&Parameter' = 'Flag1'
    NAME    FLAG    F_VAL
    USD      1      aa
    INR      1      cc
    EUR      1      ee
    AUD      1      ff
    
    -- if '&Parameter' = 'Flag2'
    NAME    FLAG    F_VAL
    INR     1       ii
    JPY     1       jj
    EUR     1       kk
    AUD     1       ll
    
    -- if '&Parameter' = 'Flag3'
    NAME    FLAG    F_VAL
    USD     1       mm
    JPY     1       pp
    EUR     1       qq
    

    Rextester Demo

    【讨论】:

    • 我已经更新了问题并指定了更多细节,因为存在一些混淆。我必须显示具有不同列值的列,在那种情况下你能在这里吗?
    【解决方案2】:

    您正在寻找 unpivot,我会使用 UNION ALL 并为每个标志添加一个 grp

     SELECT t1.* FROM (
        SELECT name,flag_1 flag,'Flag1' grp
        FROM T
        UNION ALL
        SELECT name,flag_2,'Flag2' grp
        FROM T
        UNION ALL
        SELECT name,flag_3,'Flag3' grp
        FROM T
    ) t1
    WHERE t1.grp = ? and t1.flag > 0
    

    注意

    ? 是您的参数输入,它可以代替'Flag1','Flag2' ...


    这是一个示例

    CREATE TABLE T(
       id_val int,
       name varchar(50),
       flag_1 int,
       flag_2 int,
       flag_3 int
    );
    
    
    insert into t values (1 ,'USD',1,0,1);
    insert into t values (2 ,'CAD',0,0,0);
    insert into t values (3 ,'INR',1,1,0);
    insert into t values (4 ,'JPY',0,1,1);
    insert into t values (5 ,'EUR',1,1,1);
    insert into t values (6 ,'AUD',1,1,0);
    

    查询 1

    SELECT t1.NAME,t1.FLAG
    FROM (
        SELECT name,flag_1 flag,'Flag1' grp
        FROM T
        UNION ALL
        SELECT name,flag_2,'Flag2' grp
        FROM T
        UNION ALL
        SELECT name,flag_3,'Flag3' grp
        FROM T
    ) t1
    WHERE t1.grp = 'Flag3' and t1.flag > 0
    

    Results

    | NAME | FLAG |
    |------|------|
    |  USD |    1 |
    |  JPY |    1 |
    |  EUR |    1 |
    

    【讨论】:

      【解决方案3】:

      我会在WHERE 子句中使用布尔逻辑:

      SELECT t.name, 1 AS Flag, 
             (CASE WHEN Paramerter = 'Flag1' THEN flag_1
                   WHEN Paramerter = 'Flag2' THEN flag_2
                   WHEN Paramerter = 'Flag3' THEN flag_3 
              END) AS f_val
      FROM table t
      WHERE (Paramerter = 'Flag1' AND flag_1 = 1) OR
            (Paramerter = 'Flag2' AND flag_2 = 1) OR
            (Paramerter = 'Flag3' AND flag_3 = 1);
      

      【讨论】:

      • 我已经更新了问题并指定了更多细节,因为存在一些混淆。我必须显示具有不同列值的列,在那种情况下你能在这里吗?
      • @vkrishna。 . .我会添加case 表达式。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-08
      • 2019-07-30
      • 1970-01-01
      • 1970-01-01
      • 2013-12-27
      • 2015-11-25
      • 2011-11-12
      相关资源
      最近更新 更多