谓词中的 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
表达式的谓词(即THEN
和ELSE
之后的内容)必须是文字值,而不是布尔表达式。您可以将 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 表达式