sql查询带有撇号的NVL字符串(')

时间:2016-04-22 14:22:42

标签: sql oracle toad

所以我有一个我正在研究的S​​QL查询,就像这样:

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'

但撇号在这里没有和我合作..我怎么能解决它呢?

3 个答案:

答案 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'