0

我正在尝试创建一个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;

本质上,它检查分配的日期是否在一月之后,如果是,则执行下一个case statement,否则执行function.

这是我收到的错误:

ORA-00923: FROM keyword not found where expected
00923. 00000 -  "FROM keyword not found where expected"

根据我对 的了解和研究,case statements我的语法似乎是正确的,但我不确定 acase中的 acase是否可以完成。

任何帮助深表感谢。

4

2 回答 2

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. 技术上没问题,但没必要。

于 2013-09-03T20:42:41.723 回答
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表达式中所做的那样,因为它们当然必须是相同的类型。

于 2013-09-03T20:43:13.200 回答