我有两个表,想使用 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/