需要通用查询以使用“EXISTS”关键字检查行是否存在

时间:2017-02-06 11:45:44

标签: mysql sql sql-server postgresql

以下查询适用于PostgreSQL和MS SQL,但不适用于MYSQL

SELECT 1 as retVal WHERE EXISTS (SELECT 1 FROM posts WHERE topic = 'Sports')

以下查询适用于PostgreSQL和MySQL,但不适用于MS SQL

SELECT EXISTS (SELECT 1 FROM posts WHERE topic = 'Sports')

需要一个适用于所有三家供应商的查询。

1 个答案:

答案 0 :(得分:4)

对这些数据库使用case

SELECT (CASE WHEN EXISTS (SELECT 1 FROM posts WHERE topic = 'Sports')
             THEN 1 ELSE 0
        END) as retval

这在需要FROM子句的数据库(例如Oracle和DB2)中不起作用。您可以通过创建一个名为dual的表并将其放在数据库中来解决这个问题:

SELECT (CASE WHEN EXISTS (SELECT 1 FROM posts WHERE topic = 'Sports')
             THEN 1 ELSE 0
        END) as retval
FROM dual;

或者,以下内容适用于任何数据库:

SELECT (CASE WHEN COUNT(*) > 0 THEN 1 ELSE 0 END) as retval
FROM posts
WHERE topic = 'Sports';

但是,它的效率低于使用EXISTS的版本。