IF else条件对于Oracle SQL Developer不正常工作

pokxtpni  于 2023-10-16  发布在  Oracle
关注(0)|答案(1)|浏览(125)

我基本上一直在使用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块根本没有执行。我试图检查在SQL开发人员通过替换?使用 *'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;

先谢了。

pu3pd22g

pu3pd22g1#

你只能在PL/SQL上下文中使用IF,所以你的代码需要在BEGINEND之间,你需要选择一些你不想要的东西。
这里不需要这种形式的逻辑或两个查询,您可以使用一个带有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手册中阅读有关VARIABLEEXECUTE命令的更多信息; SQL Developer使用大多数相同的命令。

相关问题