根据我的理解,DECODE函数用于使用搜索表达式检查条件并显示结果。下面的示例将DECODE函数与名为"SUM"的组函数一起使用:
SELECT COUNT(*) "Total",
SUM(DECODE(TO_CHAR(hire_date,'YYYY'),'1995',1,0)) "1995",
SUM(DECODE(TO_CHAR(hire_date,'YYYY'),'1996',1,0)) "1996",
SUM(DECODE(TO_CHAR(hire_date,'YYYY'),'1997',1,0)) "1997",
SUM(DECODE(TO_CHAR(hire_date,'YYYY'),'1998',1,0)) "1998"
FROM employees;
我试图理解它是如何与"TO_CHAR"函数和"SUM"函数一起工作的。
- 示例中使用的TO_CHAR函数将日期数据类型转换为字符数据类型,并与搜索值(1995、1996等)进行比较,并计算结果。
- 但是,SUM函数只能用于数字数据类型。
问题如下:
问题1: DECODE函数也可以接受具有不同数据类型的值吗?
例如,如果年份使用1995,1996而不是'1995','1996',则查询执行成功。
问题2:参数"1"one_answers"0"是数值型的,在TO_CHAR函数中使用,并且在组函数"SUM"中。当DECODE子句中的数据类型不同时,它是如何执行的?
请帮助。
问题1:DECODE函数也可以接受具有不同数据类型的值吗?
例如,如果年份使用1995,1996而不是'1995','1996',则查询执行成功。
不完全是,但它确实允许隐式转换。TO_CHAR正在生成一个字符串值,因此与字符串'1995'
比较是可以的。如果第二个参数是数字1995
,那么TO_CHAR结果将隐式转换为一个数字进行比较-这对于该日期格式模型也是有效的,因为年份是一个数字。
如果您有一个具有更多比较的DECODE,那么每个搜索表达式的数据类型和结果值将需要匹配,但是这里您只做了一次比较。SUM只能看到0或1
问题2:参数"1"one_answers"0"是数值型的,在TO_CHAR函数中使用,并且在组函数"SUM"中。当DECODE子句中的数据类型不同时,它是如何执行的?
1和0不是TO_CHAR函数的一部分,它们是DECODE的第三和第四个参数。因此,无论用于比较的前两个参数的数据类型如何,每个DECODE的结果都是0或1。SUM不可见被解码的值、搜索表达式或它们的数据类型。
也许将嵌套函数调用分解一点会有所帮助:
SUM(
DECODE(
TO_CHAR(hire_date,'YYYY'), -- gets a string like '1995'
'1995', -- if the string is '1995' then
1, -- then value is 1
0 -- else value is 0
) -- end of decode, result is 0 or 1
) -- end of sum of 0/1 values