我的情况很复杂。我想在Select子句中使用case(或if),然后在where子句中使用case(或if)来执行类似下面的操作:
select SP.SUBSCR, SP.PARAM2, cdit.ECAM,
(CASE WHEN SP.PARAM2 LIKE 'PP%' THEN SP2.PARAM
ELSE 'NOT FOUND'
END)
from tableA sp, tableA sp2, tableOther cdit
where SP2.SUBSCR = SP.SUBSCR
and SP.SER = 'Avalue'
and SP.PARAM = 'Bvalue'
and SP2.SERV in
(CASE WHEN SP.PARAM2 LIKE 'PP%' THEN 'PP1'
ELSE NULL
END)
and SP2.PARAM in
(CASE WHEN SP.PARAM2 LIKE 'PP%' THEN 'PP2'
ELSE NULL
END)
and CDIT.PAR = SP.PARAM2
and SP.SUBSCR in ('Anum', 'Bnum');
我需要做的是:在选择时使用SP2.PARAM
,仅在SP.PARAM2
为like 'PP%'
时使用SP2.SERV
,并为SP2.PARAM
和{{1使用(设定值)只有当SP.PARAM2再次成为like 'PP%'
时,我才不想为SP2.SERV
和SP2.PARAM
设置任何值,或者让它们为null
。
不幸的是,上面的SQL似乎适用于SP.PARAM2
为like 'PP%'
的情况,但它永远不适用于SP.PARAM2
为NOT like 'PP%'
的情况,因此从不显示{ {1}}输出。
我的猜测是它始终尝试在where子句'NOT FOUND'
设置SP2.SERV
和SP2.PARAM
的值,这很奇怪,因为CASE
肯定不总是像{{ 1}}。
因此,我可能没有正确使用SP.PARAM2
,主要是在where子句。
希望我的解释清楚。
也许我可以使用IF代替CASE,但我不知道如何,我愿意接受建议。
谢谢。
答案 0 :(得分:0)
选择,仅当SP.PARAM2类似于'PP%'时,并且仅当SP.PARAM2再次像'PP%'时才使用(设置值)SP2.SERV和SP2.PARAM,否则我不想设置SP2.SERV和SP2.PARAM的任何值,或使它们为空。
ELSE NULL
执行 ELSE 部分时,您要将列值与 NULL 进行比较。像SP2.SERV in NULL
这样的东西永远不会返回任何东西。
如果您不想包含PP1
以外的任何内容,则在过滤查询谓词中的行时,CASE表达式中没有ELSE条件。 ELSE NULL
You WHERE子句可以修改为:
AND SP2.SERV IN
(
CASE
WHEN SP.PARAM2 LIKE 'PP%' THEN
'PP1'
END)
AND SP2.PARAM IN
(
CASE
WHEN SP.PARAM2 LIKE 'PP%' THEN
'PP2'
END)
如果您想要包含不符合PP1条件的行,那么对于 NOT LIKE 条件,请将其设置为始终为TRUE 。此外,IN
运算符在这里没用,只需使用=
:
AND SP2.SERV =
(
CASE
WHEN SP.PARAM2 LIKE 'PP%' THEN
'PP1'
ELSE SP2.SERV
END)
AND SP2.PARAM =
(
CASE
WHEN SP.PARAM2 LIKE 'PP%' THEN
'PP2'
ELSE SP.PARAM2
END)
如果需要,也可以在 SELECT 中进行必要的更改。
答案 1 :(得分:0)
我对甲骨文并不十分熟悉,但甲骨文肯定有join
s和left join
s的概念,不是吗?使用left join
,您可以在满足条件时从联接表中添加字段。如果不满足条件,则该行不会像join
那样完全被解除,或者与您现在加入的方式一样,只需向from
子句添加更多表。
所以我认为你想做这样的事情:
select SP.SUBSCR, SP.PARAM2, cdit.ECAM, NVL(SP2.PARAM, 'NOT FOUND')
from tableA sp
join tableOther cdit on cdit.PAR = sp.PARAM2
left join tableA sp2 on sp2.SUBSCR = sp.SUBSCR
and sp2.SERV = 'PP1'
and sp2.PARAM = 'PP2'
and sp.PARAM2 LIKE 'PP%'
where SP.SER = 'Avalue'
and SP.PARAM = 'Bvalue'
and SP.SUBSCR in ('Anum', 'Bnum');
现在,只有满足sp2
之后列出的所有条件,才会添加on
中的字段。