首页 > 解决方案 > 对 SELECT 结果使用 IN 运算符的 IF 语句

问题描述

我正在尝试评估 SELECT 语句的结果中是否存在值。我知道您可以执行以下操作:

IF v_var IN ('A', 'B') 
THEN 
  DBMS_OUTPUT.PUT_LINE('True');
END IF;

但是,我想做类似的事情:

IF v_var IN (SELECT x FROM DUAL)
THEN 
  DBMS_OUTPUT.PUT_LINE('True');
END IF;

是否有语法合法的方式来实现这一点?

标签: sqloracleif-statementselectplsql

解决方案


我通常会通过在表上运行 count(*) 查询来检查与您正在查找的值匹配的行来处理这种逻辑。然后 count > 0 告诉您该值存在,而 count = 0 告诉您它不存在。所以代码看起来像:

  select count(*) into v_cnt from tbl where x = v_var and rownum < 2;
  IF v_cnt > 0 THEN
    DBMS_OUTPUT.PUT_LINE('True');
  END IF;

请注意,优化器可以自由使用相关的访问结构(例如索引、分区、区域映射)来有效地执行此查询。并且rownum < 2谓词在找到 v_var 的匹配项后立即停止查询;我们这样做是因为EXISTS意味着我们并不关心我们有多少匹配,我们只需要区分零匹配和非零匹配。


推荐阅读