在CASE语句中转换为CHAR值,该语句返回不同的数据类型

时间:2016-06-23 16:27:47

标签: sql oracle select case

我的工作查询如下:

    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' )

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

有解决方案吗?

3 个答案:

答案 0 :(得分:4)

Dim func1 As String func1 = DashboardSheet.Range("D15").Value Dim result As Range Set result = OpenJobsCalcSheet.Range("B:B").Find(func1) If result Is Not Nothing Then result.Select Else MsgBox "Woopsie!" End If 表达式的所有分支都需要返回相同的数据类型 - 在您的情况下,需要返回case。您可以通过将第二个char分支中的数字明确转换为when来实现此目的:

char

答案 1 :(得分:1)

您正在CHAR和/或NUMBER条款中混合不相关的类型(THENELSE作为错误消息)。虽然有些数据库会自动转换它们,但不需要使用标准的数据库。

因此,您应该CAST(number AS CHAR(1))。{/ p>

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

答案 2 :(得分:0)

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

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