我基本上一直在使用 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分页报表的参数。但是,我收到错误,并且这个 if block 根本没有执行。我尝试通过替换 ? 来检查 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;
提前致谢。
您只能在 PL/SQL 上下文中使用
IF
,因此您的代码需要位于 BEGIN
和
END
之间,并且您需要选择某些内容,这并不是您真正想要的.不过,您不需要这种形式的逻辑或两个查询,您可以使用带有
case 表达式 的单个查询来决定所选的列:
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 手册中阅读有关 和 EXECUTE
命令的更多信息; SQL Developer 使用大部分相同的命令。