在ORACLE的DECODE函数中使用的参数



根据我的理解,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"函数一起工作的。

  1. 示例中使用的TO_CHAR函数将日期数据类型转换为字符数据类型,并与搜索值(1995、1996等)进行比较,并计算结果。
  2. 但是,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

最新更新