Oracle SQL Developer 的 IF else 条件无法正常工作

IF else condition not working properly for Oracle SQL Developer

提问人:sam 提问时间:10/13/2023 最后编辑:Alex Poolesam 更新时间:10/13/2023 访问量:56

问:

我基本上一直在使用 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; 

提前致谢。

SQL Oracle IF- 条件语句

评论


答:

2赞 Alex Poole 10/13/2023 #1

您只能在 PL/SQL 上下文中使用 IF,因此您的代码需要介于 和 之间,并且您需要选择一些您真正想要的东西。BEGINEND

不过,您不需要这种形式的逻辑或两个查询,您可以使用带有事例表达式的单个查询来决定所选的列;假设两列的数据类型相同:

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 手册中阅读有关 VARIABLEEXECUTE 命令的更多信息;SQL Developer 使用大多数相同的命令。

评论

1赞 astentx 10/13/2023
我想说的是,几乎任何 DBMS(包括 SQL Server)都应该使用完全相同的代码,而不是流控制语句。因为它实际上并不决定应该使用什么源(对象),而是应该返回什么表达式。根据 SQL 规则和消费者细节(BI 工具),此表达式在执行过程中应具有相同的数据类型,这不需要切换到条件返回。
0赞 sam 10/13/2023
谢谢亚历克斯。您的解决方案就像一个魅力。