我尝试修改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语句中公开要使用的列?
答案 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