Oracle SQL将两个不同的列转换为一列?

时间:2014-12-11 14:34:34

标签: sql oracle casting

我从两个不同的列中选择数据,具体取决于它的记录类型。

使用Case语句我检查它是什么类型的记录,并选择要插入的相应列。

但是,使用CAST的语法不正确,在检查Oracle文档后,没有理由说它不起作用。

    CREATE TABLE TEST123 AS
SELECT DISTINCT
              bill.ROW_ID,
              bill.ACCNT_TYPE_CD,
              CASE
              WHEN bill.ACCNT_TYPE_CD = 'TestAccount'
              THEN  CAST(TO_CHAR(bill.INTEGRATION_ID) AS VARCHAR2(30)) AS NUM
              ELSE CAST(TO_CHAR(bill.OU_NUM )AS VARCHAR2(30)) AS NUM
              END        
FROM SIEBEL.S_ORG_EXT bill
INNER JOIN Products prod
ON prod.BILL_ACCNT_ID = bill.ROW_ID
OR prod.CUST_ACCNT_ID = bill.ROW_ID;

错误代码是:

  

ORA-00905:缺少关键字   00905. 00000 - "缺少关键字"

2 个答案:

答案 0 :(得分:4)

AS NUM必须遵循END的{​​{1}}。如果可以单独为每个条件设置列名,则该列可以有两个不同的名称。显然,这无法奏效。

CASE

此外,同时使用CASE WHEN bill.ACCNT_TYPE_CD = 'TestAccount' THEN CAST(TO_CHAR(bill.INTEGRATION_ID) AS VARCHAR2(30)) ELSE CAST(TO_CHAR(bill.OU_NUM )AS VARCHAR2(30)) END AS NUM TO_CHAR也是多余的。它们都是将非字符串转换为字符串的方式。

答案 1 :(得分:3)

由于CASE .. END是一个函数,你可以比 Allan 所解释的更进一步:

SELECT DISTINCT ...
    CAST(
        CASE WHEN bill.ACCNT_TYPE_CD = 'TestAccount'
          THEN bill.INTEGRATION_ID
          ELSE bill.OU_NUM
        END
        AS VARCHAR(30) -- `AS` here is part of the `CAST` function
                       --      and will denote the requested data type
    ) AS NUM           -- `AS` here introduces the column alias

如果您不熟悉CAST功能,请注意此处AS关键字的双重含义。请参阅上面代码中的注释