当你做SELECT 1
你正在提取硬编码的值1,而不是,如你所料,第一列;您的查询是
SQL> SELECT 1
2 FROM (SELECT '0' AS R FROM DUAL
3 UNION
4 SELECT '1' AS R FROM DUAL
5 );
1
----------
1
1
即两行包含1;这些行的SUM
给出了2:
SQL> SELECT SUM(1)
2 FROM (SELECT '0' AS R FROM DUAL
3 UNION
4 SELECT '1' AS R FROM DUAL
5 );
SUM(1)
----------
2
例如,你可以尝试
SQL> select 100
2 from (select 1 from dual);
100
----------
100
这阐明了select 100
不查找内部查询第100列,而只是给出了价值100
在下面的查询中,您正在提取R
(我将字符串编辑为数字)中的变量值;在您的查询你有两排像以下,其中R
在另一个行和1 0:
SQL> SELECT R
2 FROM (SELECT 0 AS R FROM DUAL
3 UNION
4 SELECT 1 AS R FROM DUAL
5 );
R
----------
0
1
这两个值的总和是0 + 1 = 1
:
SQL> SELECT SUM(R)
2 FROM (SELECT 0 AS R FROM DUAL
3 UNION
4 SELECT 1 AS R FROM DUAL
5 );
SUM(R)
----------
1
SQL>
的Oracle或MySQL ? – Aleksej
请使用有意义的标题 – HoneyBadger
如果第二个查询满足您的期望,那么Oracle教会您有错误的期望。你应该预期第二个查询抛出一个错误,因为你正在添加字符串。不幸的是,甲骨文有一种“阅读你的思想”的坏习惯,并将字符串转换为数字,没有任何警告。它会很好地帮助你消除这种习惯。 – mathguy