期望的char得到数字SUM Oracle

时间:2016-09-08 06:59:13

标签: oracle

    SELECT
  (
    CASE     
      WHEN  s.weight = '-'  THEN s.weight      
      ELSE SUM(s.weight)
      END
   ) AS weight
FROM
  shipping s
WHERE
  s.id_packing_info = 257834; 

您好,我将重量存储在数据库中" - "如果不必使用重量和数字,如果有。

当它到来时 - ' - '它出现错误

**ORA-00932: inconsistent datatypes: expected CHAR got NUMBER
00932. 00000 -  "inconsistent datatypes: expected %s got %s"
*Cause:    
*Action:
Error at Line: 185 Column: 12**  on **ELSE SUM(s.weight)**
为什么?因为它必须输入然后才能进入ELSE。

2 个答案:

答案 0 :(得分:2)

您可以在聚合和函数中评估案例表达式:

SELECT
  NVL(TO_CHAR(SUM(
      CASE WHEN s.weight = '-' THEN NULL ELSE TO_NUMBER(s.weight) END
    )), '-') AS weight
FROM
  shipping s
WHERE
  s.id_packing_info = 257834; 

如果ID只有值'-',则case表达式求值为null,因此sum也为null;那就是NVL回到破折号。

如果ID具有任何“数字”值,则案例将评估为这些值的实际数字,并且总和按预期工作,并且不为空。如果你有数字和破折号(你说你不会有),那么破折号仍然被评估为空但是数字仍然总结,所以破折号被有效忽略。

使用一些补充数据进行演示:

with shipping (id_packing_info, weight) as (
  select 257834, '-' from dual
  union all select 257835, '2' from dual
  union all select 257835, '3' from dual
  union all select 257836, '4' from dual
  union all select 257836, '5' from dual
  union all select 257836, '-' from dual
)
SELECT
  NVL(TO_CHAR(SUM(
      CASE WHEN s.weight = '-' THEN NULL ELSE TO_NUMBER(s.weight) END
    )), '-') AS weight
FROM
  shipping s
WHERE
  s.id_packing_info = 257834; 

WEIGHT                                 
----------------------------------------
-                                       

...
WHERE
  s.id_packing_info = 257835; 

WEIGHT                                 
----------------------------------------
5                                       

...
WHERE
  s.id_packing_info = 257836; 

WEIGHT                                 
----------------------------------------
9                                       

明确的TO_NUMBER()并不是必需的,但它使它更清晰一点。但是,需要显式的TO_CHAR(),以阻止NVL()尝试将短划线转换为与SUM()结果相同的数据类型,这将获得ORA-01722。

这与您在原始代码中获得ORA-00932的原因相同。 case表达式的第一个分支求值为一个字符串,因此它希望第二个分支执行相同的操作;但SUM()为您提供的数字不是字符串。那么,您可能会认为可以将其更改为:

CASE     
  WHEN  s.weight = '-'  THEN s.weight      
  ELSE TO_CHAR(SUM(s.weight))
  END

但这是混合聚合值和非聚合值,因此您最终会得到ORA-00937:不是单组组函数。

答案 1 :(得分:2)

或者您可以添加一个条件来跳过此类记录

SELECT NVL(TO_CHAR(SUM(TO_NUMBER(s.weight))), '-') AS weight
FROM shipping s
WHERE  s.id_packing_info = 257834 AND s.weight <> '-'