案例表达式在sql查询中无法正常工作

时间:2016-05-10 09:01:55

标签: sql oracle

我想用逗号分隔符连接supplier表的列,并将其放入名为“contact”的别名字段中。我使用了一些情况来检查空值。假设contact_number2为空,则contact_number3将位于别名字段中,反之亦然。这是我的查询

SELECT supplier_Name, supplier_Address, supplier_reference, contact_Number1,
       contact_number2, contact_number3,
      (case when contact_number2 is null then contact_number3 
            when contact_number3 is null then contact_number2 
            when contact_number3 is null and contact_number2 is null then 0
         -- when contact_number2 is not null and contact_number3 is not null then  CONCAT(CONCAT(contact_number2,','), contact_number3)
       end) as contact
FROM SUPPLIER

如果我使用第四个条件然后它可以工作但是如果我使用多个条件则它不起作用。错误是ORA-00932: inconsistent datatypes: expected NUMBER got CHAR 00932. 00000 - "inconsistent datatypes: expected %s got %s"

4 个答案:

答案 0 :(得分:3)

第三种情况是期待一个VARCHAR并且你提供了一个INT,因为它返回了一个错误。改变是我用'0'代替0。试试这个:

contact_number3

答案 1 :(得分:2)

我认为你是在追求这样的事情:

select supplier_name,
       supplier_address,
       supplier_reference,
       contact_number1,
       contact_number2,
       contact_number3,
       case when contact_number2 is not null and contact_number3 is not null then contact_number2||','||contact_number3
            when contact_number3 is null and contact_number2 is null then '0'
            when contact_number2 is null then to_char(contact_number3)
            when contact_number3 is null then to_char(contact_number2)
       end as contact
from   supplier;

请注意,case表达式在满足的第一个条件处停止,因此您应确保条件的顺序正确。 (例如,在我的查询中,当你到达“当contact_number2为null然后是contact_number3”时,我们已经知道,由于先前的条件,contact_number3不能为空。)

此外,我已将您的CONCAT转换为更常见(更灵活)||表单。使用CONCAT,您一次只能连接两个内容,而您可以有多个||来连接各种字符串。

您遇到错误的原因是因为当您将两个数字连接在一起时(特别是当您在混合中添加逗号!)时,结果将是一个字符串。像您这样的CASE表达式对每个条件的结果使用相同的数据类型。

答案 2 :(得分:1)

你必须在concat之前将数字数据转换为字符。

案例表达式的所有返回值必须是类型兼容的:

SELECT supplier_Name, supplier_Address, supplier_reference, contact_Number1,
       contact_number2, contact_number3,
       case when contact_number2 is not null and contact_number3 is not null
                then CONCAT(CONCAT(cast(contact_number2 as varchar(15)),','),
                            cast(contact_number3 as varchar(15)))
            else cast(coalesce(contact_number2, contact_number3, 0) as varchar(15))
       end as contact
FROM SUPPLIER

答案 3 :(得分:0)

使用此

  SELECT supplier_Name, supplier_Address, supplier_reference, contact_Number1,
     contact_number2, contact_number3,
     case when contact_number2 is null then contact_number3 
          when contact_number3 is null then contact_number2 
          when contact_number3 is null and contact_number2 is null then '0'
          when contact_number2 is not null and contact_number3 is not null then contact_number2||','||contact_number3
     end as contact
  FROM SUPPLIER