Sql select Case语句中的Case语句

Sql select Case语句中的Case语句,sql,oracle,case,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 <

我试图创建一个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语句的了解和研究,我的语法似乎是正确的,但我不确定case中的case是否是可以完成的


非常感谢您的帮助。

以下是正确的语法:

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中调用函数不需要子查询。从技术上讲,它还可以,但不必要。

中肯定有语法错误

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)

最后,确保函数\u legal\u chk返回Varchar或Char,就像它在第一个WHEN表达式中一样,因为它们当然必须是相同的类型。

我猜函数\u legal\u chk不会返回Char,因此不兼容?错误消息是什么?用错误消息更新了我的问题,第一次完全忘了添加它。谢谢不过,为了回答您的问题,该函数确实返回char.Yikes,忘记这件事太愚蠢了。谢谢你指出这一点!是的,这似乎已经做了这个把戏。非常感谢你的帮助!还感谢您让我知道在这种情况下不需要子查询来调用函数。看起来好像OP正在向函数传递常量。如果是这种情况,那么将其放在子选择中是一个很好的理由。@Ben:为了性能而不首先进行测量,将代码变得更复杂、可读性更低,这绝不是一个很好的理由。如果这是针对我@inflagranti的,那么我同意;我只是指出,并发症不一定是不必要的,也不一定是不必要的,表面上的并发症背后有一个有效的基于性能的原因,我不知道这种情况是否真的发生了。
function_legal_chk(:V_ACCT, :V_TRAN_DATE)