选择使用案例或if和case case或if where子句

时间:2015-03-16 09:03:48

标签: sql oracle

我的情况很复杂。我想在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.SERV,并为SP2.PARAM和{{1使用(设定值)只有当SP.PARAM2再次成为like 'PP%'时,我才不想为SP2.SERVSP2.PARAM设置任何值,或者让它们为null

不幸的是,上面的SQL似乎适用于SP.PARAM2like 'PP%'的情况,但它永远不适用于SP.PARAM2NOT like 'PP%'的情况,因此从不显示{ {1}}输出。 我的猜测是它始终尝试在where子句'NOT FOUND'设置SP2.SERVSP2.PARAM的值,这很奇怪,因为CASE肯定不总是像{{ 1}}。 因此,我可能没有正确使用SP.PARAM2,主要是在where子句。

希望我的解释清楚。

也许我可以使用IF代替CASE,但我不知道如何,我愿意接受建议。

谢谢。

2 个答案:

答案 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中的字段。