提问人:sam 提问时间:10/13/2023 最后编辑:Alex Poolesam 更新时间:10/13/2023 访问量:56
Oracle SQL Developer 的 IF else 条件无法正常工作
IF else condition not working properly for Oracle SQL Developer
问:
我基本上一直在使用 SQL Server。但是,最近我搬到了 Oracle,我正在尝试一个简单的 if else 语句,但它在 Oracle SQL Developer 中出现错误。下面是未执行的查询
IF (? = 'MEANING') THEN
SELECT rv_meaning_l1 vc_result
FROM TableA
WHERE rv_domain = 'CLAIM TYPE'
AND rv_low_value = '10';
ELSIF (? = 'ABBREVIATION') THEN
SELECT rv_abbreviation_l1 vc_result
FROM TableA
WHERE rv_domain = 'CLAIM TYPE'
AND rv_low_value = '10';
END IF;
的值将来自通过 ODBC 连接的 Power BI 分页报表的参数。但是,如果块根本没有执行,我就会收到错误。我试图通过替换 sql developer 来签入 sql developer?与“MEANING”,但代码仍未执行。
IF ('MEANING' = 'MEANING') THEN
SELECT rv_meaning_l1 vc_result
FROM TableA
WHERE rv_domain = 'CLAIM TYPE'
AND rv_low_value = '10';
ELSIF ('MEANING' = 'ABBREVIATION') THEN
SELECT rv_abbreviation_l1 vc_result
FROM TableA
WHERE rv_domain = 'CLAIM TYPE'
AND rv_low_value = '10';
END IF;
提前致谢。
答:
2赞
Alex Poole
10/13/2023
#1
您只能在 PL/SQL 上下文中使用 IF
,因此您的代码需要介于 和 之间,并且您需要选择一些您真正想要的东西。BEGIN
END
不过,您不需要这种形式的逻辑或两个查询,您可以使用带有事例表达式的单个查询来决定所选的列;假设两列的数据类型相同:
SELECT CASE(?
WHEN 'MEANING' THEN rv_meaning_l1
WHEN 'ABBREVIATION' THEN rv_abbreviation_l1
ELSE NULL
END vc_result
FROM TableA
WHERE rv_domain = 'CLAIM TYPE'
AND rv_low_value = '10';
这是可选的,因为如果没有匹配,这是默认值,但我把它放进去是为了让它更清楚,所以如果你愿意,如果变量既不是预期值,你也可以返回一些其他值。ELSE NULL
如果要在 SQL Developer 中测试它,请在它识别的形式中使用绑定变量:
var arg varchar2(10);
exec :arg := 'MEANING';
SELECT CASE(:arg
WHEN 'MEANING' THEN rv_meaning_l1
WHEN 'ABBREVIATION' THEN rv_abbreviation_l1
ELSE NULL
END vc_result
FROM TableA
WHERE rv_domain = 'CLAIM TYPE'
AND rv_low_value = '10';
您可以在 SQL*Plus 手册中阅读有关 VARIABLE
和 EXECUTE
命令的更多信息;SQL Developer 使用大多数相同的命令。
评论
1赞
astentx
10/13/2023
我想说的是,几乎任何 DBMS(包括 SQL Server)都应该使用完全相同的代码,而不是流控制语句。因为它实际上并不决定应该使用什么源(对象),而是应该返回什么表达式。根据 SQL 规则和消费者细节(BI 工具),此表达式在执行过程中应具有相同的数据类型,这不需要切换到条件返回。
0赞
sam
10/13/2023
谢谢亚历克斯。您的解决方案就像一个魅力。
评论