具有空值的Oracle SQL Case语句
我正在尝试创建一个Oracle查询,该查询将使用基于按钮的具有空值的Oracle SQL Case语句,sql,oracle,parameters,Sql,Oracle,Parameters,我正在尝试创建一个Oracle查询,该查询将使用基于按钮的CommandName的参数 这是我的问题 SELECT id FROM table WHERE dateTime IS (CASE WHEN :CommandName = 'FIRST' THEN NULL ELSE NOT NULL END) 因此,我正在传递参数,但它不起作用-我只是得到一个缺少NULL关键字的错误 我基本上不想基于输入的参数编写两个单独的查询 甚至不确定这是否可行,或者这是否是正确的方法 有什么想法吗?我想
CommandName
的参数
这是我的问题
SELECT id
FROM table
WHERE dateTime IS (CASE WHEN :CommandName = 'FIRST' THEN NULL ELSE NOT NULL END)
因此,我正在传递参数,但它不起作用-我只是得到一个缺少NULL关键字的错误
我基本上不想基于输入的参数编写两个单独的查询
甚至不确定这是否可行,或者这是否是正确的方法
有什么想法吗?我想
SELECT id
FROM table
WHERE (dateTime IS NULL AND :CommandName='FIRST') OR (dateTime IS NOT NULL AND :CommandName <> 'FIRST')
选择id
从桌子上
其中(dateTime为NULL且:CommandName='FIRST')或(dateTime不为NULL且:CommandName'FIRST'))
应该执行您需要的操作。如果不使用动态SQL返回字符串“NULL”或“notnull”,您可以使用两个NVL()
函数:
select id
from table
where NVL(dateTime,'FIRST') = NVL(:param,dateTime);
但是,如果对dateTime进行了索引(Oracle可以为空索引),那么NVL()函数将禁用索引。您可能需要进一步阅读CASE语句
我相信您需要以下代码:
SELECT
id
FROM
table
WHERE
(
(dateTime IS NULL AND :CommandName = 'FIRST')
OR
(dateTime IS NOT NULL AND NVL(:CommandName, '') <> 'FIRST')
)
选择
身份证件
从…起
桌子
哪里
(
(dateTime为NULL,并且:CommandName='FIRST')
或
(dateTime不为NULL且NVL(:CommandName“”)“FIRST”)
)
a尽管基于这样的假设,但这是一种有趣的方式:param是FIRST或NULLOracle将“NULL=NULL”计算为NULL,因此在这种情况下它不会返回任何内容。@jva True,但当dateTime为NULL(“FIRST”)时,运算符左侧的第一个NVL()提供了另一个值,因此第一个表达式永远不会为NULL。如果:param为null,则dateTime列将用于所有行,dateTime实际上为null的任何行都将被丢弃,因为'FIRST'=null
的计算结果为false。这就是说,我正在用或操作符挖掘@John D的解决方案,尽管我会将这对互斥的条件包装在括号中,这样其他谓词将按预期应用。感谢您提供的信息-使用是否更好=代码>或
不同的地方说不同的东西是ANSI标准,而在所有数据库系统中都不兼容(虽然在本例中,绝大多数都是如此)。啊,好的地方-在检查SQL是否不相等时,先更新SQL,使其具有NVL