[英]select using case or if and also case or if at where clause
我的情况很复杂。 我想在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
只有当SP.PARAM2又是like 'PP%'
,否则我不想为SP2.SERV
和SP2.PARAM
设置任何值,或者将它们设置为null
。
不幸的是,上面的SQL似乎适用于SP.PARAM2
like 'PP%'
的情况, SP.PARAM2
适用于SP.PARAM2
NOT like 'PP%'
,因此从不在输出中显示'NOT FOUND'
。 我的猜测是,它总是尝试在where子句CASE
处设置SP2.SERV
和SP2.PARAM
值,这很奇怪,因为SP.PARAM2
当然并不总是像'PP%'
。 因此,我可能主要在where子句中无法正确使用CASE
。
希望我的解释清楚。
也许我可以使用IF代替CASE,但是我不知道如何,我愿意接受建议。
谢谢。
仅当SP.PARAM2类似于“ PP%”时才选择,并且仅当SP.PARAM2再次类似于“ PP%”时也才对SP2.SERV和SP2.PARAM使用(设置值),否则我不想设置任何值SP2.SERV和SP2.PARAM,或者将它们设置为null。
否则为空
执行ELSE部分时,您正在将列值与NULL进行比较。 像SP2.SERV in NULL
这样的东西SP2.SERV in NULL
中将永远不会返回任何东西。
如果您不想包括PP1
以外的任何内容,则在过滤查询谓词中的行时,CASE表达式中没有ELSE条件。 ELSE NULL
您的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中进行必要的更改。
我不是非常熟悉Oracle,但是肯定Oracle具有join
的概念,特别是left join
的概念,不是吗? 使用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');
因此,现在,仅当满足on
之后列出的所有条件时,才添加sp2
中的字段。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.