ORA-00932: 数据类型不一致: 预期 NUMBER 从 case 表达式中得到 CHAR

ORA-00932: inconsistent datatypes: expected NUMBER got CHAR from case expression

我正在尝试大小写表达式:

SELECT
    CASE
        WHEN CAB.CODTIPOPER IN (3200, 3201, 3210) 
            THEN CAB.NUMNOTA
        WHEN CAB.CODTIPOPER IN (3100, 3106) 
            THEN (SELECT DISTINCT GET_NFES(VAR.NUNOTAORIG) 
                  FROM TGFVAR VAR 
                  WHERE VAR.NUNOTAORIG = CAB.NUNOTA) 
        ELSE NULL
    END AS "NUM_NF"
--this select inside the parenthesis is a sql typed per the ERP devs

但是我得到这个错误:

ORA-00932: inconsistent datatypes: expected NUMBER got CHAR

我做错了什么?

原因肯定是 GET_NFES() 返回的是 VARCHAR 结果,而 NUMNOTA 是一个数字。您可以使用 TO_NUMBER() 修复类型,但是这个 SELECT DISTINCT ... 只会触发我,因为在 CASE 中您可以获得多行的地方看起来是错误的。

鉴于您的错误是:

ORA-00932: inconsistent datatypes: expected NUMBER got CHAR

然后:

  • CAB.NUMNOTANUMBER 数据类型并且
  • GET_NFES(VAR.NUNOTAORIG) returns 是字符串数据类型。

您需要使用 TO_CHAR(CAB.NUMNOTA)TO_NUMBER(GET_NFES(VAR.NUNOTAORIG)) 将它们转换为相同的数据类型。

所以要么:

SELECT CASE
       WHEN CAB.CODTIPOPER IN (3200, 3201, 3210) 
       THEN TO_CHAR(CAB.NUMNOTA)
       WHEN CAB.CODTIPOPER IN (3100, 3106) 
       THEN (SELECT DISTINCT
                    GET_NFES(VAR.NUNOTAORIG) 
             FROM   TGFVAR VAR 
             WHERE  VAR.NUNOTAORIG = CAB.NUNOTA) 
       ELSE NULL
       END AS "NUM_NF"

或:

SELECT CASE
       WHEN CAB.CODTIPOPER IN (3200, 3201, 3210) 
       THEN CAB.NUMNOTA
       WHEN CAB.CODTIPOPER IN (3100, 3106) 
       THEN (SELECT DISTINCT
                    TO_NUMBER(GET_NFES(VAR.NUNOTAORIG))
             FROM   TGFVAR VAR 
             WHERE  VAR.NUNOTAORIG = CAB.NUNOTA) 
       ELSE NULL
       END AS "NUM_NF"

(注意:如果 GET_NFES(VAR.NUNOTAORIG) 不是 return 包含数字的字符串,那么尝试将其转换为数字将失败,因此您更可能想要第一个选项优于第二个选项。)

(注意 2:如果 sub-query return 超过一行,您可能会收到更多错误。)