求Firebird 3中Count with Case等效写法,遇SQL错误码-104
解决Firebird 3中Count+Case的等效写法问题
嘿,刚接触Firebird的CASE语法踩坑很正常!你遇到的SQL错误码-104,是因为Firebird对布尔表达式的处理逻辑和SQLite不一样——它不允许你把两个CASE的结果直接用AND拼起来丢给Count函数。
你的需求是统计同时满足两个关键字条件的行数(因为关键字存在多行,没法用WHERE直接过滤),那我们可以把两个条件合并到同一个CASE语句里,这样Firebird就能正确识别了。
正确写法1:用Count结合单CASE
SELECT Count(CASE WHEN keywords.keyword LIKE '%purchased%' AND keywords.keyword LIKE '%your_second_keyword%' -- 替换成你的第二个条件 THEN 1 END) AS matched_rows FROM keywords;
原理很简单:当两个条件都满足时,CASE返回1,否则返回NULL;而Count函数会自动忽略NULL值,最终统计的就是同时符合两个条件的行数。
正确写法2:用Sum替代Count
如果你觉得Count的逻辑有点绕,也可以用Sum来实现,效果完全一样:
SELECT SUM(CASE WHEN keywords.keyword LIKE '%purchased%' AND keywords.keyword LIKE '%your_second_keyword%' THEN 1 ELSE 0 END) AS matched_rows FROM keywords;
这里符合条件的行加1,不符合的加0,Sum直接累加出总数,Firebird对这种写法的兼容性也很好。
为什么原语句报错?
SQLite比较灵活,允许把两个CASE的结果(1或NULL)做布尔AND运算,但Firebird对表达式的类型要求更严格——它不支持在Count的参数里直接做这种布尔拼接,必须把所有判断逻辑整合到单个CASE的WHEN子句中才行。
内容的提问来源于stack exchange,提问作者nDelphi
相关产品推荐
相关产品推荐

