sql - 对 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;
是否有语法合法的方式来实现这一点?
解决方案
我通常会通过在表上运行 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意味着我们并不关心我们有多少匹配,我们只需要区分零匹配和非零匹配。
推荐阅读
- c# - 连接数据库并存储表单中的 Post 数据 (ASP.NET MVC)
- r - 如何在 ggplot2 中具有不均匀组的条形图中使用误差线并纠正闪避?
- ejb - 通过独立应用程序从容器外部查找 EJBHome 失败
- r - 我可以使用 AICc 根据嵌套数据对模型进行排名吗?
- shell - 在重定向中使用 <> 时,POSIX 定义的行为是什么?
- laravel - Laravel forge - 多台服务器如何访问同一个数据库
- ssis - 如何从平面文件中删除列名并替换为“标题记录信息”..(文件名、时间戳等)
- javascript - 如何通过 Id 对消息做出反应
- python-3.x - 如何将来自 HTTP 请求的文件附加到电子邮件?(Python/AWS Lambda)
- angular - 我正在尝试以模型驱动的形式创建一个自定义验证器,这是实现它的正确方法吗