【问题标题】:Convert to CHAR value in a CASE statement that returns different data types在返回不同数据类型的 CASE 语句中转换为 CHAR 值
【发布时间】:2016-10-26 02:39:17
【问题描述】:

我有一个工作查询如下:

    SELECT DISTINCT col1, col2, 
    CASE 
    WHEN COUNT(DISTINCT col3_typeID) OVER (PARTITION BY col1) = 1
    THEN col3_typeID   <-- this is what interests me

    WHEN COUNT(DISTINCT col3_typeID) OVER (PARTITION BY col1) > 1
    THEN COUNT(DISTINCT col3_typeID) OVER (PARTITION BY col1)
    END 
    COUNT(col4) OVER (PARTITION BY col1)
    FROM table
  -- joins
  -- other conditions

我计算了一些东西,如果是COUNT() = 1,那么我返回一个ID,而不是其中的一些ID。理想情况下,我想返回 ID 的 CHAR 值。如果我尝试用CHAR 类型的列替换上面的标记行,我会得到

ORA-00932: inconsistent datatypes: expected CHAR got NUMBER 

我也试过 DECODE() 为:

 THEN DECODE(col3_typeID, 1 , 'type1'
                         2,  'type2' )

但我自然会遇到同样的错误,因为这是基本的数据类型限制。

有解决办法吗?

【问题讨论】:

    标签: sql oracle select case


    【解决方案1】:

    case 表达式的所有分支都需要返回相同的数据类型 - 在您的情况下是 char。您也可以通过将第二个 when 分支中的数字显式转换为 char 来实现这一点:

    CASE 
    WHEN COUNT(DISTINCT col3_typeID) OVER (PARTITION BY col1) = 1
    THEN col3_typeID -- Assume this is a CHAR column
    
    WHEN COUNT(DISTINCT col3_typeID) OVER (PARTITION BY col1) > 1
    THEN TO_CHAR(COUNT(DISTINCT col3_typeID) OVER (PARTITION BY col1)) -- Here!
    END 
    

    【讨论】:

    • 有效!我希望有时我能跳出框框思考更多。可能时会接受。非常感谢。
    【解决方案2】:

    您在 THEN 和/或 ELSE 子句中混合了不相关的类型(CHARNUMBER 作为错误消息状态)。虽然有些数据库会自动转换它们,但并不要求符合标准的数据库这样做。

    因此,您应该在适当的情况下CAST(number AS CHAR(1))

    在我写的一篇文章中找到完整的故事:

    【讨论】:

      【解决方案3】:

      每个 CASE 的类型必须可以转换为相同的类型。您试图在第一种情况下返回 CHAR,在第二种情况下返回 COUNT() 的结果,即 bigint。

      您可以 A) 将它们强制为相同的类型 (CAST) 或 B) 返回包含两个结果的记录。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-29
        相关资源
        最近更新 更多