select case语句中的case语句

时间:2013-09-03 20:37:16

标签: sql oracle case

我正在尝试创建一个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是否可以完成。

非常感谢任何帮助。

2 个答案:

答案 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表达式中一样,因为它们必须是同一类型当然。