谓词中的 CASE 中为 NULL

Posted

技术标签:

【中文标题】谓词中的 CASE 中为 NULL【英文标题】:IS NULL in CASE in predicates 【发布时间】:2020-02-04 08:05:39 【问题描述】:

请告诉我,这是真的 - 使用 CASE 构造,其中包含 IS NULL/IS NOT NULL 的表达式将在 TNEN 中返回? 我在一个包中有一个接收输入参数的过程,它被传递给光标中的选择器,我想设置一个谓词:

  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 不为 NULL 且 !='Y' 和 !='N' 则 t1.id=input_parm

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

【问题讨论】:

今日提示:切换到现代、明确的JOIN 语法。更容易编写(没有错误),更容易阅读(和维护),并且在需要时更容易转换为外连接。 WHERE 子句中使用AND/OR 构造而不是case 表达式 通常会更好。 【参考方案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

【讨论】:

感谢您的回答,这正是我所需要的【参考方案2】:

使用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

干杯!!

【讨论】:

感谢您的回答,我同意施工和/或会更好

以上是关于谓词中的 CASE 中为 NULL的主要内容,如果未能解决你的问题,请参考以下文章

SQL基础教程(第2版)第6章 函数谓词CASE表达式:6-2 谓词

SQL基础教程(第2版)第6章 函数谓词CASE表达式:6-3 CASE表达式

[SQL] SQL 基础知识梳理- 函数谓词CASE 表达式

在核心数据谓词中为元素名称使用变量

SQL基础教程(第2版)第6章 函数谓词CASE表达式:6-1 函数

7645 Null 或空全文谓词