繁体   English   中英

选择用例或if和case或if在where子句

[英]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.PARAM2like 'PP%' ,还可以使用(设定值)为SP2.SERVSP2.PARAM只有当SP.PARAM2又是like 'PP%' ,否则我不想为SP2.SERVSP2.PARAM设置任何值,或者将它们设置为null

不幸的是,上面的SQL似乎适用于SP.PARAM2 like 'PP%'的情况, SP.PARAM2适用于SP.PARAM2 NOT like 'PP%' ,因此从不在输出中显示'NOT FOUND' 我的猜测是,它总是尝试在where子句CASE处设置SP2.SERVSP2.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM