Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在Oracle中根据条件选择列值_Sql_Oracle - Fatal编程技术网

Sql 如何在Oracle中根据条件选择列值

Sql 如何在Oracle中根据条件选择列值,sql,oracle,Sql,Oracle,我有一个表,从中生成报告。我可以传递参数值来调用另一个使用查询填充数据的报表。数据应该根据我们传递的参数进行更改,其中列值是根据参数值选择的 以下是我的示例输入和基于参数的预期输出 输入表 id_val name flag_1 f1_val flag_2 f2_val flag_3 f3_val 1 USD 1 aa 0 gg 1 mm 2

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

以下是我的示例输入和基于参数的预期输出

输入表

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
基于参数值的输出

如果参数=Flag1

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

我会在
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);

如果您正在寻找unpivot,我将使用UNION ALL to并为每个标志添加一个
grp
make it

 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
| NAME | FLAG |
|------|------|
|  USD |    1 |
|  JPY |    1 |
|  EUR |    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
| NAME | FLAG |
|------|------|
|  USD |    1 |
|  JPY |    1 |
|  EUR |    1 |

您可以轻松、干净地使用解码:

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

我已经更新了问题,并指定了更多细节,因为有一些混乱。我必须显示具有不同列值的列,您能在该场景中显示此列吗?我已经更新了问题并指定了更多详细信息,因为存在一些混淆。我必须显示具有不同列值的列,在该场景中,您能在这里显示吗?@vkrishna。我将添加
case
表达式。