CASE中谓词中的IS NULL

问题描述 投票:0回答:2

告诉我,这是真实的-使用CASE构造,其中将在TNEN中返回带有IS NULL / IS NOT NULL的表达式?我在一个程序包中有一个过程,该过程接收输入参数,并将其传递给游标中的选择器,我要设置谓词之一:

  select t1...
         t2...
  from test t1,
       test t2
  where t1.flg = 'N'
  AND t2.field = 'supertest'
  AND CASE 
            WHEN input_parm = 'Y' THEN t1.id IS NOT NULL
            WHEN input_parm = 'N' THEN t1.id IS NULL
            WHEN input_parm IS NULL THEN
            ELSE t1.id = input_parm
            END

input_parm-是进入程序的参数

  • 如果input_parm = Y,则t1.id字段不等于null
  • 如果input_parm = N,则t1.id字段等于null
  • 如果input_parm为null,则不应将此条件视为条件,那些选择器应同时来自IS NULL和IS NOT NULL
  • 如果input_parm不为空并且!='Y'和!='N',则t1.id = input_parm

在示例中,编译器在THEN之后宣誓为IS NULL。你能帮我一下吗?

sql oracle plsql case isnull
2个回答
1
投票

CASE表达式的谓词(即THENELSE之后的谓词)必须是文字值,而不是布尔表达式。您可以将CASE表达式重构为:

AND
    (input_parm = 'Y' AND t1.id IS NOT NULL) OR
    (input_parm = 'N' AND t1.id IS NULL) OR
    input_parm IS NULL OR
    t1.id = input_parm

0
投票

使用AND/OR更容易,但是如果您确实想使用CASE..WHEN,则可以使用以下方法:

    CASE
        WHEN INPUT_PARM = 'Y'
             AND T1.ID IS NOT NULL THEN 1
        WHEN INPUT_PARM = 'N'
             AND T1.ID IS NULL THEN 1
        WHEN INPUT_PARM IS NULL THEN 1
        WHEN T1.ID = INPUT_PARM THEN 1
    END = 1

干杯!

© www.soinside.com 2019 - 2024. All rights reserved.