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
表达式。