2016-04-22 70 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