如何编写单条SQL返回布尔值判断两个指定查询结果是否相等?
如何用单条SQL判断两个查询结果是否相等
嘿,这个问题我熟!你想要用单条SQL判断两个查询的结果是否相等,之前的写法不对,是因为不能直接把两个子查询那样嵌套进IF里。下面根据不同的数据库类型,给你几种靠谱的写法:
针对 MySQL/MariaDB
你可以用IF()函数直接返回布尔值(TRUE/FALSE),或者利用比较表达式本身的结果(会返回1/0,代表真/假):
写法1:用IF函数返回明确的TRUE/FALSE
SELECT IF( (SELECT COUNT(*) FROM CALENDAR) = (SELECT value FROM PARAMETER WHERE name = 'PLAN_HORIZON'), TRUE, FALSE ) AS are_values_equal;
写法2:直接比较并转成布尔类型
SELECT CAST( (SELECT COUNT(*) FROM CALENDAR) = (SELECT value FROM PARAMETER WHERE name = 'PLAN_HORIZON') AS BOOLEAN ) AS are_values_equal;
针对 PostgreSQL
PostgreSQL原生支持布尔类型,所以可以直接写比较表达式,结果会直接返回true或false:
写法1:直接比较
SELECT (SELECT COUNT(*) FROM CALENDAR) = (SELECT value FROM PARAMETER WHERE name = 'PLAN_HORIZON') AS are_values_equal;
写法2:用CASE语句(更兼容复杂逻辑)
SELECT CASE WHEN (SELECT COUNT(*) FROM CALENDAR) = (SELECT value FROM PARAMETER WHERE name = 'PLAN_HORIZON') THEN TRUE ELSE FALSE END AS are_values_equal;
针对 SQL Server
SQL Server没有原生布尔类型,通常用1/0或者字符串'TRUE'/'FALSE'来表示真假:
写法1:返回1(真)或0(假)
SELECT CASE WHEN (SELECT COUNT(*) FROM CALENDAR) = (SELECT value FROM PARAMETER WHERE name = 'PLAN_HORIZON') THEN 1 ELSE 0 END AS are_values_equal;
写法2:返回字符串'TRUE'/'FALSE'
SELECT CASE WHEN (SELECT COUNT(*) FROM CALENDAR) = (SELECT value FROM PARAMETER WHERE name = 'PLAN_HORIZON') THEN 'TRUE' ELSE 'FALSE' END AS are_values_equal;
重要注意事项
要确保查询SELECT value FROM PARAMETER WHERE name = 'PLAN_HORIZON'只返回单个值!如果这个条件匹配到多条记录,子查询会返回多行,导致整个SQL报错。如果存在多条记录的可能,可以改成:
-- 取最大值(适用于所有数据库) (SELECT MAX(value) FROM PARAMETER WHERE name = 'PLAN_HORIZON') -- 或者只取第一条(MySQL/PostgreSQL) (SELECT value FROM PARAMETER WHERE name = 'PLAN_HORIZON' LIMIT 1)
内容的提问来源于stack exchange,提问作者user3613864
相关产品推荐
相关产品推荐

