SQL 组合两个 SQL 语句的输出以返回一个 bool 值

标签 sql oracle

我有两个表,想使用 SQL 确保两个表中都存在数据。

SELECT COUNT(*) FROM teachers WHERE is_registered IS NOT NULL;
SELECT COUNT(*) FROM students WHERE is_registered IS NOT NULL;

我想确保以上两个语句都返回 0。如果是这样,我想返回 TRUE,否则我想返回 False。

我可以从 SQL 脚本执行此操作吗?

最佳答案

一种方法是将它们放在子查询中:

SELECt (CASE WHEN t.cnt = 0 AND s.cnt = 0 THEN 'TRUE' ELSE 'FALSE' END) as flag
FROM (SELECT COUNT(*) as cnt
      FROM teachers
      WHERE is_registered IS NOT NULL
     ) t CROSS JOIN
     (SELECT COUNT(*) as cnt
      FROM students
      WHERE is_registered IS NOT NULL
     ) s;

不过,一般来说,使用 EXISTS/NOT EXISTS 比聚合更有效:

SELECT (CASE WHEN NOT EXISTS (SELECT 1
                              FROM teachers
                              WHERE is_registered IS NOT NULL) AND
                  NOT EXISTS (SELECT 1
                              FROM students
                              WHERE is_registered IS NOT NULL)
             THEN 'TRUE' ELSE 'FALSE'
        END)
FROM DUAL;

这个公式如何更有效?首先,NOT EXISTS 可以在不符合条件的第一行停止。 COUNT(*) 总是必须读取整个表,即使它遇到的第一行不符合条件。计数需要准确。

其次,如果第一个条件成功(或失败,取决于您如何看待它),则根本不需要评估 students 上的条件。

关于SQL 组合两个 SQL 语句的输出以返回一个 bool 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57541938/

相关文章:

sql - 编写原始查询时如何处理带有连字符 (-) 的 SQL 表名?即项目用户

python - 为什么 MySQL 将 acuñar 注册为 acunar 的重复条目?

oracle - 没有时间存储日期是否使用更少的字节?

sql - 如何格式化时间戳

如果任一匹配查询,MySQL 查询将返回 2 个值的结果

sql - 模糊匹配两个哈希表?

mysql - 在 MySQL 查询中同时使用存在和简单值检查

sql - 插入带有子查询和序列的sql语句

oracle - Airflow Oracle 运算符(operator)

sql-server - 这些表对于 SQL Server 或 Oracle 来说太大了吗?