我正在尝试创建一个case
语句,但我似乎在某种程度上弄乱了语法。以下是我到目前为止的情况:
SELECT lp.assign_date, CASE WHEN lp.assign_date > '01-JAN-13'
THEN
(select count(*) > 0 THEN 'BAD' ELSE 'GOOD' END
FROM transaction_table
WHERE ACCOUNT = :V_ACCT
AND transaction_date < :V_TRAN_DATE
AND transaction_code = :V_TRAN_CODE
AND :V_TRAN_CODE IN (1,6,25)
AND attorney_id = :V_ATTY_ID)
ELSE
(SELECT
function_legal_chk(:V_ACCT, :V_TRAN_DATE)
FROM dual)
FROM legal_placement lp;
基本上是检查分配的日期是否在1月之后,如果是,则执行下一个case statement
否则执行function
。
以下是我收到的错误:
ORA-00923: FROM keyword not found where expected
00923. 00000 - "FROM keyword not found where expected"
根据我对case statements
所做的了解和研究,我的语法似乎是正确的,但我不确定case
中的case
是否可以完成。
非常感谢任何帮助。
答案 0 :(得分:1)
这是正确的语法:
SELECT lp.assign_date,
(CASE WHEN lp.assign_date > '01-JAN-13'
THEN (select (CASE WHEN count(*) > 0 THEN 'BAD' ELSE 'GOOD' END)
FROM transaction_table
WHERE ACCOUNT = :V_ACCT
AND transaction_date < :V_TRAN_DATE
AND transaction_code = :V_TRAN_CODE
AND :V_TRAN_CODE IN (1,6,25)
AND attorney_id = :V_ATTY_ID
)
ELSE function_legal_chk(:V_ACCT, :V_TRAN_DATE)
END)
FROM legal_placement lp;
嵌套的case
语句必须完全在子查询中(如上所示)或完全在外部。你原来有一半。此外,您不需要子查询来调用select
中的函数。技术上还可以,但不必要。
答案 1 :(得分:1)
中肯定存在语法错误
select count(*) > 0 THEN 'BAD' ELSE 'GOOD' END
应该是
select CASE WHEN count(*) > 0 THEN 'BAD' ELSE 'GOOD' END
另外,正如@GordonLindoff指出的那样,你不需要第二个子查询:
(SELECT
function_legal_chk(:V_ACCT, :V_TRAN_DATE)
FROM dual)
可以写成
function_legal_chk(:V_ACCT, :V_TRAN_DATE)
最后,请确保function_legal_chk
返回Varchar
(或Char
),就像它在第一个WHEN
表达式中一样,因为它们必须是同一类型当然。