2

我正在尝试创建一个 Oracle 查询,该查询将使用基于CommandName按钮的参数。

所以这是我的查询

SELECT id 
FROM table 
WHERE dateTime IS (CASE WHEN :CommandName = 'FIRST' THEN NULL ELSE NOT NULL END)

所以我正在传递参数,但它不起作用 - 我只是得到一个Missing NULL keyword错误

我基本上不想根据输入的参数编写两个单独的查询

甚至不确定这是否可能,或者这是否是正确的做法?

有任何想法吗?

4

3 回答 3

4

您可能需要更多地阅读 CASE 语句。

我相信您想要以下代码:

SELECT
    id 
FROM 
    table 
WHERE 
    (
        (dateTime IS NULL AND :CommandName = 'FIRST')
        OR
        (dateTime IS NOT NULL AND NVL(:CommandName, '') <> 'FIRST')
    )
于 2012-07-23T17:12:54.630 回答
1

如果不使用动态 SQL 返回字符串“NULL”或“NOT NULL”,您可以使用两个NVL()函数:

select id
from table
where NVL(dateTime,'FIRST') = NVL(:param,dateTime);

但是,如果 dateTime 被索引(并且 Oracle 可以索引 NULL),则 NVL() 函数将禁用索引。

于 2012-07-23T17:12:28.450 回答
0

我觉得

SELECT id 
FROM table 
WHERE (dateTime IS NULL AND :CommandName='FIRST') OR (dateTime IS NOT NULL AND :CommandName <> 'FIRST')

应该做你需要的。

于 2012-07-23T17:11:42.257 回答