2014-07-03 63 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中正确选择的作品 对不起我的英语:) –