搜索为null时在oracle中解码的行为

时间:2016-06-01 12:04:15

标签: sql oracle

我正在阅读Oracle decode() documentation。据我所知,在调用decode(expr, search1, value1, search2, value2...)时,Oracle会将exprsearch2search3投射到search1类型并进行比较。

因此,如果search1NULL,那么search2search3等会被投射到什么位置?

示例

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?

2 个答案:

答案 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;

现在用数字

更改null
SELECT 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)