在Oracle SQL CASE语句中公开列

时间:2016-05-04 18:41:25

标签: sql oracle

我尝试修改SQL select语句以选择列的反向值(如果值为正,则为负,如果值为负则为正),基于不同列的值。

这(不反转)有效:

BSEG_WBTR as INVOICE_AMOUNT

但这不是:

CASE
  WHEN BSEG_SHKZG = 'S' THEN
    -BSEG_WBTR
  ELSE
    BSEG_WBTR
  END AS INVOICE_AMOUNT,

给出错误:

  

[错误]执行(13:45):ORA-00904:" BSEG_WBTR":无效标识符

这似乎意味着在CASE声明中不再暴露BSEG_WBTR。

如何在CASE语句中公开要使用的列?

3 个答案:

答案 0 :(得分:1)

只需将该值乘以-1即可。试试这个:

CASE
  WHEN BSEG_SHKZG = 'S' THEN
    BSEG_WBTR * -1
  ELSE
    BSEG_WBTR
  END AS INVOICE_AMOUNT,

答案 1 :(得分:0)

下面的查询显示了完成您尝试的三种方法。我的首选语法是第二个(使用列名称一次,case提供乘数)。

SELECT CASE WHEN bseg_shkzg = 'S' THEN -bseg_wbtr ELSE bseg_wbtr END
          AS invoice_amount,
       bseg_wbtr * CASE bseg_shkzg WHEN 'S' THEN -1 ELSE 1 END
          AS invoice_amount2,
       CASE WHEN bseg_shkzg = 'S' THEN 0 - bseg_wbtr ELSE bseg_wbtr END
          AS invoice_amount3
FROM   (SELECT 10 AS bseg_wbtr, 'S' AS bseg_shkzg FROM DUAL
        UNION ALL
        SELECT 20 AS bseg_wbtr, 'R' AS bseg_shkzg FROM DUAL)

第一个似乎是你最初尝试的,所以我不确定你看到的错误与你得到的错误直接相关。

答案 2 :(得分:0)

  

根据不同列的值选择列的倒数值(如果值为正,则为负,如果值为负,则为正)。

将任何值乘以-1将返回反向值。

示例:

DECLARE @BSEG_SHKZG AS INT = 2;
SELECT @BSEG_SHKZG * -1  -- results -2

DECLARE @BSEG_SHKZG_ AS INT = -2;
SELECT @BSEG_SHKZG_ * -1  -- results 2

因此,以下查询将返回您的预期结果:

CASE
WHEN BSEG_SHKZG = 'S' THEN
    BSEG_WBTR * -1
ELSE
    BSEG_WBTR
END AS INVOICE_AMOUNT