[英]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.