所以我有一个我正在研究的SQL查询,就像这样:
SELECT * from tableA where
( status = NVL('','OPEN') or status = NVL('','CLOSED') )
and delete_flag != 'Y'
以上查询工作正常,并给我我想要的结果..但我想知道是否有任何方式我可以将上述状态IN NVL行合并为一个而不是使用或那里。
例如,我希望能够:
SELECT * from tableA where
status IN NVL('','OPEN','CLOSED')
and delete_flag != 'Y'
但撇号在这里没有和我合作..我怎么能解决它呢?
答案 0 :(得分:1)
您正在从应用程序中获取一个输入参数,该参数可以包含值" Open"," Closed"或null
您希望能够选择等于此输入参数的状态值(如果它为空)或输入值(如果它不是
)。要将过滤器的null设为null,请使用COALESCE和要过滤的列。
喜欢这个
SELECT * from tableA
where COALESCE(parameter,status) = status
and status in ('OPEN','CLOSED') -- see comments
and delete_flag != 'Y'
在这种情况下,如果参数为OPEN,您将获得所有OPEN项目,如果参数为CLOSED,您将获得所有已关闭的项目,如果参数为null,则您将获得所有项目。
这是Web应用程序中非常常见的模式。
单行版
SELECT * from tableA
where COALESCE(parameter,CASE WHEN status in ('OPEN','CLOSED') then status ELSE '' END) = status
and delete_flag != 'Y'
答案 1 :(得分:1)
简单地:
if (averageResult < 7 && averageResult > 5)
{
student.Average_Grade = "F";
}
答案 2 :(得分:1)
在Oracle中,空字符串''
相当于NULL
。
所以NVL( '', 'OPEN' )
相当于NVL( NULL, 'OPEN' )
,可以简化为'OPEN'
。
所以你的查询是:
SELECT *
FROM tableA
WHERE ( status = 'OPEN' OR status = 'CLOSED' )
AND delete_flag != 'Y'
可以简化为:
SELECT *
FROM tableA
WHERE status IN ( 'OPEN', 'CLOSED' )
AND delete_flag != 'Y'
您可以使用集合实现动态选项列表:
CREATE TYPE stringlist IS TABLE OF VARCHAR2(100);
/
SELECT a.*
FROM tableA a
INNER JOIN
( SELECT stringlist( 'OPEN', 'CLOSED' ) AS options FROM DUAL ) o
ON ( o.options IS EMPTY OR a.status MEMBER OF o.options )
WHERE a.delete_flag <> 'Y'