我正在阅读Oracle decode()
documentation。据我所知,在调用decode(expr, search1, value1, search2, value2...)
时,Oracle会将expr
,search2
和search3
投射到search1
类型并进行比较。
因此,如果search1
为NULL
,那么search2
,search3
等会被投射到什么位置?
示例:
create table sc(a date, b varchar2(256));
insert into sc values(
to_date('2010-01-01 11:22:33', 'yyyy-mm-dd hh24:mi:ss'),
'2010-01-01 11:22:33'
);
select decode(
to_date('2010-01-01 11:22:33', 'yyyy-mm-dd hh24:mi:ss'),
null,
1,
b,
123,
a,
456
)
from sc;
为什么结果是456而不是123?
答案 0 :(得分:3)
编辑: 当要比较的第一个值为null或char时,所有值都将转换为varchar2并作为字符串进行比较。因此,如果不比较字符串,则比较始终相等的类型并且不使用null作为第一个比较值:
select decode(
to_date('2010-01-01 11:22:33', 'yyyy-mm-dd hh24:mi:ss'),
to_date('2010-01-01 11:22:31', 'yyyy-mm-dd hh24:mi:ss'),
0,
null,
1,
to_char(to_date('2010-01-01 11:22:33', 'yyyy-mm-dd hh24:mi:ss')),
2,
to_date(b, 'yyyy-mm-dd hh24:mi:ss'),
123,
a,
456
)
from sc;
如果第一个比较值为NULL,则日期将转换为具有默认日期表示的字符串(可以与b中的不同)并与b进行比较。如果您想查看默认值,请使用:
select to_char(to_date('2010-01-01 11:22:33', 'yyyy-mm-dd hh24:mi:ss')),b from sc
如果我们阅读Oracle文档:
如果第一个结果的数据类型为CHAR,或者第一个结果是 null,然后Oracle将返回值转换为数据类型VARCHAR2。
值也是如此。第一个值为null,然后所有内容都转换为字符串..你可以在这里看到它。
SELECT DECODE (1, NULL, 1, '01', 2, '1 ', 3, '1', 4, 1, 5) FROM DUAL;
现在用数字
更改nullSELECT DECODE (1, 5, 1, '01', 2, '1 ', 3, '1', 4, 1, 5) FROM DUAL;
什么会给这个:
SELECT DECODE (TO_DATE ('2010-01-01 11:22:33', 'yyyy-mm-dd hh24:mi:ss'),
NULL, 1,
TO_DATE ('2010-01-01 15:22:32', 'yyyy-mm-dd hh24:mi:ss'), 2,
'3')
FROM DUAL
答案 1 :(得分:1)
为了让您更好地理解
SELECT DECODE( 1, NULL, 1, 33, '1', 44 ) FROM DUAL;
会给你44因为,它在查找字段中找不到1并且是默认值。
( 1, -> Search expression
NULL, 1, -> Find and replace
33, 1, -> Find and replace
44 ) -> default
44
另外
SELECT DECODE( 1, NULL, 22, 1, 33, '1', 44 ) FROM DUAL;
会给你33,因为它在find字段中找到1并且替换为值(33)。
( 1, -> Search expression
NULL, 22, -> Find and replace
1, 33, -> Find and replace
1, 44 ) -> Find and replace and no default
33
另外
SELECT DECODE( 1, NULL, 22, 1, 33, '1', 44 ) FROM DUAL;
会给你NULL,因为它在查找字段中找不到1并且是不存在的默认值。
( 1, -> Search expression
NULL, 22, -> Find and replace
2, 33, -> Find and replace
2, 44 ) -> Find and replace and no default
(null)