2014-07-03 60 views
3

我有一些問題,用下面的語句:解碼聲明:奇怪的行爲

SELECT 1 
FROM dual 
WHERE DECODE(1, 
      0, 
      (SELECT COUNT(*) from tbl), 
      1) > 0 

如果「TBL」是空的,這個查詢的執行以某種方式返回任何內容。

在另一方面,執行查詢:

SELECT 1 
FROM dual 
WHERE DECODE(1, 
      0, 
      (SELECT COUNT(*) from tbl), 
      1) = 1 

返回1

而且,這樣的:

SELECT 1 
FROM dual 
WHERE DECODE(1, 
      0, 
      (SELECT COUNT(*) from tbl), 
      1) = 0 

也返回1。我在想什麼?

編輯1 sqlplus的上市

SQL> select count(*) from ids; 

    COUNT(*) 
---------- 
    0 

SQL> SELECT 1 
    2 FROM dual 
    3 WHERE DECODE(1, 
    4   0, 
    5   (SELECT COUNT(*) from ids), 
    6   1) > 0; 

no rows selected 

SQL> SELECT 1 
    2 FROM dual 
    3 WHERE DECODE(1, 
    4   0, 
    5   (SELECT COUNT(*) from ids), 
    6   1) =1; 

     1 
---------- 
     1 

SQL> SELECT 1 
    2 FROM dual 
    3 WHERE DECODE(1, 
    4   0, 
    5   (SELECT COUNT(*) from ids), 
    6   1) =0; 

     1 
---------- 
     1 
+0

你看到哪個版本的行爲?無論11.2.0.3中'tbl'中有多少行,我分別得到1,1行和無行。 –

+0

感謝您的快速回復。我的Oracle版本是11.2.0.4 –

+0

'SELECT DECODE(1,0,(SELECT COUNT(*)from tbl),1)FROM DUAL'根據'tbl'中的行數給出不同的結果嗎?它顯然總是返回1,所以任何其他行爲看起來像一個錯誤。 (除非你將查詢和結果順序混淆在一起......) –

回答

0

通過在選擇築巢它獲取解碼出來的,其中原因。這不會很有效,但它應該起作用。你真的想在這裏做什麼?你能用一個非數字的例子來舉個例子:)。

SELECT 1 FROM雙 WHERE(選擇從IDS DECODE(1,0 , (SELECT COUNT(*)), 1)從雙 )= 0;

+1

這並沒有解決爲什麼行爲出現口氣錯誤。這可能會解決這個問題(沒有11.2.0.4來測試),但並沒有真正回答這個問題。它應該工作,並在早期版本中。我*懷疑* OP已經將這個簡化爲最簡單的例子,在更復雜的代碼中看到了這個問題。 –

+0

是的,我已經用類似的結構替換了這個不可靠的陳述,現在我的腳本工作得很好。但是不能保證其他人將來不會面臨這個問題。它顯然應該工作。由於我自己沒有Oracle Support ID,所以我已通知我的僱主,我相信他們會提出支持請求。 PS。我檢查了 - 解碼包裝在11.2.0.4中正確選擇的作品 對不起我的英語:) –