如何正确使用NVL/DECODE?
How to use NVL/DECODE correcly?
我有以下查询 (Oracle) 需要更正:
select
parm_data_1,
parm_data_2,
parm_data_3,
parm_data_4,
parm_data_5,
parm_data_6,
parm_data_7,
parm_data_8,
parm_data_9,
parm_data_10,
parm_data_11,
parm_data_12,
parm_data_13,
parm_data_14,
parm_data_15,
parm_data_16,
parm_data_17,
parm_data_18,
parm_data_19,
parm_data_20,
wild_card_ind
-- End SIR A3109
from dbt_c_param_data
where
parm_id = i_param_id and
brch_code in ( nvl(i_pdet(1),'*'), '*') and
prod_code in ( nvl(i_pdet(2),'*'), '*') and
cus_mst_no in ( nvl(i_pdet(3),'*'), '*') and
parm_key_1 in ( nvl(i_key_val(1),'*'), '*' , '**') and
parm_key_2 in ( nvl(i_key_val(2),'*'), '*' , '**') and
parm_key_3 in ( nvl(i_key_val(3),'*'), '*' , '**') and
parm_key_4 in ( nvl(i_key_val(4),'*'), '*' , '**') and
parm_key_5 in ( nvl(i_key_val(5),'*'), '*' , '**') and
parm_key_6 in ( nvl(i_key_val(6),'*'), '*' , '**') and
parm_key_7 in ( nvl(i_key_val(7),'*'), '*' , '**') and
parm_key_8 in ( nvl(i_key_val(8),'*'), '*' , '**') and
parm_key_9 in ( nvl(i_key_val(9),'*'), '*' , '**') and
parm_key_10 in (nvl(i_key_val(10),'*'),'*' , '**')
order by wild_card_ind asc;
在上述查询的 IN( .. , .. , ..)
子句中,如果 i_key_value(i) 的值不为空,则它变成 (value, *, **).
如果不为空,我只希望在 IN
子句中使用 ( value )
之类的东西,否则 ('*', '**')
如何修改查询来实现?
试试这个;)
...
and
((i_key_val(1) is not null and parm_key_1 in (i_key_val(1))) or parm_key_1 in ('*', '**'))
and
((i_key_val(2) is not null and parm_key_2 in (i_key_val(2))) or parm_key_2 in ('*', '**'))
...
或者这个;)
...
parm_key_1 in ( nvl(i_key_val(1),'*'), nvl(i_key_val(1),'**')) and
...
我有以下查询 (Oracle) 需要更正:
select
parm_data_1,
parm_data_2,
parm_data_3,
parm_data_4,
parm_data_5,
parm_data_6,
parm_data_7,
parm_data_8,
parm_data_9,
parm_data_10,
parm_data_11,
parm_data_12,
parm_data_13,
parm_data_14,
parm_data_15,
parm_data_16,
parm_data_17,
parm_data_18,
parm_data_19,
parm_data_20,
wild_card_ind
-- End SIR A3109
from dbt_c_param_data
where
parm_id = i_param_id and
brch_code in ( nvl(i_pdet(1),'*'), '*') and
prod_code in ( nvl(i_pdet(2),'*'), '*') and
cus_mst_no in ( nvl(i_pdet(3),'*'), '*') and
parm_key_1 in ( nvl(i_key_val(1),'*'), '*' , '**') and
parm_key_2 in ( nvl(i_key_val(2),'*'), '*' , '**') and
parm_key_3 in ( nvl(i_key_val(3),'*'), '*' , '**') and
parm_key_4 in ( nvl(i_key_val(4),'*'), '*' , '**') and
parm_key_5 in ( nvl(i_key_val(5),'*'), '*' , '**') and
parm_key_6 in ( nvl(i_key_val(6),'*'), '*' , '**') and
parm_key_7 in ( nvl(i_key_val(7),'*'), '*' , '**') and
parm_key_8 in ( nvl(i_key_val(8),'*'), '*' , '**') and
parm_key_9 in ( nvl(i_key_val(9),'*'), '*' , '**') and
parm_key_10 in (nvl(i_key_val(10),'*'),'*' , '**')
order by wild_card_ind asc;
在上述查询的 IN( .. , .. , ..)
子句中,如果 i_key_value(i) 的值不为空,则它变成 (value, *, **).
如果不为空,我只希望在 IN
子句中使用 ( value )
之类的东西,否则 ('*', '**')
如何修改查询来实现?
试试这个;)
...
and
((i_key_val(1) is not null and parm_key_1 in (i_key_val(1))) or parm_key_1 in ('*', '**'))
and
((i_key_val(2) is not null and parm_key_2 in (i_key_val(2))) or parm_key_2 in ('*', '**'))
...
或者这个;)
...
parm_key_1 in ( nvl(i_key_val(1),'*'), nvl(i_key_val(1),'**')) and
...