简体   繁体   English

select case语句中的case语句

[英]Case statement within select case statement

I am trying to create a case statement to work but I seem to be messing up the syntax somehow. 我正在尝试创建一个case语句,但我似乎在某种程度上弄乱了语法。 Here is what I have so far: 这是我到目前为止:

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;

Essentially its checking to see if the assigned date is after January, if it is then do the next case statement else do the function . 基本上它检查分配的日期是否在1月之后,如果是,则执行下一个case statement否则执行该function

Here is the error that I am receiving: 这是我收到的错误:

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

From what I know and research that I've done on case statements , my syntax seems to be correct but I am not sure if a case within a case is something that can be done. 根据我对case statements所做的知识和研究,我的语法似乎是正确的但我不确定case中的case是否可以完成。

Any help is much appreciated. 任何帮助深表感谢。

Here is correct syntax: 这是正确的语法:

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;

The nested case statement either has to be entirely in the subquery (as shown above) or entirely outside. 嵌套的case语句必须完全在子查询中(如上所示)或完全在外部。 Your original has it half-and-half. 你原来有一半。 Also, you don't need a subquery to call a function in a select . 此外,您不需要子查询来调用select的函数。 It is technically ok, but unnecessary. 技术上还可以,但不必要。

There's definitely a syntax error in 肯定存在语法错误

select count(*) > 0 THEN 'BAD' ELSE 'GOOD' END

It should be 它应该是

select CASE WHEN count(*) > 0 THEN 'BAD' ELSE 'GOOD' END

Also, as pointed out by @GordonLindoff, you don't need the second subquery: 另外,正如@GordonLindoff所指出的,你不需要第二个子查询:

(SELECT
function_legal_chk(:V_ACCT, :V_TRAN_DATE)
FROM dual)

Can just be written as 可以写成

function_legal_chk(:V_ACCT, :V_TRAN_DATE)

And finally, make sure function_legal_chk returns a Varchar (or Char ) like it does in the first first WHEN expression, since they have to be that same type of course. 最后,确保function_legal_chk像第一个WHEN表达式一样返回Varchar (或Char ),因为它们必须是同一类型的路径。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM