ORACLE

时间:2015-07-19 09:22:29

标签: sql oracle sum 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函数只能与数值数据类型一起使用。
  3. 以下是问题:

    问题1: DECODE函数是否也可以采用具有不同数据类型的值?

    例如,如果这些年份用作1995年,1996年而不是1995年' 1996'则查询将成功执行。

    问题2:参数" 1"和" 0"是数字并在TO_CHAR函数中使用,它在组函数" SUM"中。当DECODE子句中的数据类型不同时,它如何执行?

    请帮忙。

1 个答案:

答案 0 :(得分:0)

  

问题1:DECODE函数是否也可以采用具有不同数据类型的值?

     

例如,如果年份用作1995年,1996年而不是“1995年”,“1996年”,那么查询将成功执行。

不完全,但确实允许隐式转换。 TO_CHAR正在生成一个字符串值,因此与字符串'1995'进行比较就可以了。如果第二个参数是数字1995,那么TO_CHAR结果将被隐式转换为数字以进行比较 - 这也与该日期格式模型有效,因为年份是数字。

如果你有一个带有更多比较的DECODE,那么每个搜索表达式和结果值的数据类型都需要匹配,但你只是在这里进行一次比较。 SUM只能看到0或1。

  

问题2:参数“1”和“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