【问题标题】:Oracle SQL Cast two different columns to one column?Oracle SQL将两个不同的列转换为一列?
【发布时间】:2014-12-12 06:24:58
【问题描述】:

我根据记录的类型从两个不同的列中选择数据。

使用 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 - “缺少关键字”

【问题讨论】:

    标签: sql oracle casting


    【解决方案1】:

    AS NUM 必须跟在CASEEND 后面。如果您可以分别为每个条件设置列名,则该列可以有两个不同的名称。显然这是行不通的。

    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_CHARCAST(... as VARCHAR(30)) 是多余的。它们都是将非字符串转换为字符串的两种方式。

    【讨论】:

      【解决方案2】:

      由于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 关键字的双重含义。见上面代码中的cmets

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-06
        • 1970-01-01
        • 2023-04-05
        • 1970-01-01
        相关资源
        最近更新 更多