2016-04-22 39 views
0

所以我有一个SQL查询我目前的工作对是这样的:SQL查询字符串NVL用单引号(')

SELECT * from tableA where 
(status = NVL('','OPEN') or status = NVL('','CLOSED')) 
and delete_flag != 'Y' 

上述查询工作正常,给我我想要的结果..但我想知道是否有反正我可以将上述状态在NVL行结合到一个,而不是使用或那里。

例如,我希望能够做到:

SELECT * from tableA where 
status IN NVL('','OPEN','CLOSED') 
and delete_flag != 'Y' 

但撇号不是我在这里工作。我怎样才能解决呢?

+1

究竟是什么:

SELECT * FROM tableA WHERE status IN ('OPEN', 'CLOSED') AND delete_flag != 'Y' 

您可以使用集合实现的选项的动态列表你想做什么? –

+0

@vkp我想看看,如果我可以结合这两个状态=语句像在我的例子中显示的一条线.. – psj01

+0

对不起..是否有意义?... – psj01

回答

1

您都可以从您的应用程序的输入参数的值可以是“开放”,“关闭”或空

你想成为能够选择等于该输入paremeter状态值是否为空或输入的值如果不是。

对于过滤器默认为所有使用COALESCE和要过滤的列的空值。

像这样

SELECT * from tableA 
where COALESCE(parameter,status) = status 
    and status in ('OPEN','CLOSED') -- see comments 
    and delete_flag != 'Y' 

在这种情况下,如果参数是OPEN,你会得到所有打开的项目,如果参数被关闭时,您将得到所有封闭的项目,如果它是空,你会得到所有项目。

这是Web应用程序中非常常见的模式。


单行版本

SELECT * from tableA 
where COALESCE(parameter,CASE WHEN status in ('OPEN','CLOSED') then status ELSE '' END) = status 
    and delete_flag != 'Y' 
+0

中选择NULL值只要OP传入'OPEN','CLOSED'或'',状态不可空 –

+0

@hogan这种工作..但如果它的空我只想'OPEN'和'CLOSED'项目..状态也有其他值。 – psj01

+0

@ psj01好的我编辑来做到这一点。 – Hogan

1

简单:

SELECT * from tableA 
where 1=1 
    and nvl(status, '---') IN ('OPEN','CLOSED') 
    and delete_flag != 'Y' 
+0

为什么'1 = 1'和为什么要使用'NVL'?如果状态为NULL,并且它不是IN('OPEN','CLOSED')',那么该行将不会被包含 - 与测试“--- ---”完全相同。 – MT0

+0

1 = 1是为了更容易阅读 – Thomas

1

在Oracle空字符串''相当于NULL

所以NVL('', 'OPEN')相当于NVL(NULL, 'OPEN')可以简化为'OPEN'

所以您查询的是:

SELECT * 
FROM tableA 
WHERE (status = 'OPEN' OR status = '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' 
+0

是的。但我有用户,从下拉列表中选择打开或关闭..如果用户不选择打开或关闭..然后我想选择状态处于打开或关闭状态的所有行..哪这就是为什么我使用NVL('','xyz'),如果用户没有选择任何东西,那么它的'',我希望它替换为xyz ..注意:除了打开/关闭之外,表中还有其他状态.. – psj01

+0

@ psj01那么你应该在问题中说明。 – MT0

+0

是的,我意识到这个问题是有点不清楚..但我不知道如何正确地说话..对此感到遗憾。 – psj01