我需要从用户那里获取输入,该输入将传递给查询并与现有值 AA 进行比较。如果是 AA,则将选择 ABC 模式。
下面的查询工作正常,
select distinct a.TABLE_OWNER,a.table_name,a.index_name,b.column_name
from dba_indexes a, dba_ind_columns b
where a.index_name=b.index_name
and a.table_name = b.table_name
and a.table_owner in ( case when &user_input = 'AA' then 'ABC' end )
order by 1,2,3,4;
但是如果我不得不再提一个模式名称,例如 DEF,我将如何做。我尝试使用逗号,但它抛出错误,“缺少右括号”
select distinct a.TABLE_OWNER,a.table_name,a.index_name,b.column_name
from dba_indexes a, dba_ind_columns b
where a.index_name=b.index_name
and a.table_name = b.table_name
and a.table_owner in ( case when &user_input = 'AA' then 'ABC','DEF' end )
order by 1,2,3,4;
错误
ORA-00907: missing right parenthesis
00907. 00000 - "missing right parenthesis"
*Cause:
*Action:
Error at Line: 5 Column: 63
我从 Ask Tom 网站上读到,只能返回一个标量值,是否可以返回一堆值?
这是在 WHERE 子句中使用 CASE 的正确方法。
...
and case &user_input when 'AA' then case when a.table_owner in ('ABC', DEF') then 1 end
else case when <your other conditions here> then 1 end
end
= 1
这个怎么运作:
首先&user_input
与“AA”进行比较。如果为真,a.table_owner
则与 'ABC' 和 'DEF' 进行比较,如果是其中之一,则CASE
表达式的值为 1,否则为 NULL(默认情况下)。如果&user_input
不是 'AA'(也可能是 NULL),则评估您未说明的其他条件,如果为真,则CASE
表达式的计算结果为 1,否则为 NULL。
然后将CASE
表达式的结果与数字 1 进行比较。
一个好处是:如果“其他条件”很昂贵(大量计算,诸如此类),则&user_input
由于短路评估,如果是“AA”,则这种安排保证它们不会被执行。你有没有这样的控制,如果你写的条件AND
和OR
经营者独自一人。
还要注意外部 CASE 中 CASE 表达式的嵌套 - 这在许多情况下是完全有效和有用的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句