Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有空值的Oracle SQL Case语句_Sql_Oracle_Parameters - Fatal编程技术网

具有空值的Oracle SQL Case语句

具有空值的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关键字的错误 我基本上不想基于输入的参数编写两个单独的查询 甚至不确定这是否可行,或者这是否是正确的方法 有什么想法吗?我想

我正在尝试创建一个Oracle查询,该查询将使用基于按钮的
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