MySQL IF/query到PostgreSQL的转换

MySQL IF/query到PostgreSQL的转换,mysql,sql,postgresql,Mysql,Sql,Postgresql,我正在将一个站点从mysql迁移到PostgreSQL(到目前为止我非常喜欢),但是我有一个关于某个查询的问题。请注意,这不是一个存储函数-这是一个在python脚本中手动传入的字符串(我知道这是一个糟糕的做法,但它仅适用于内部应用程序)。在mysql中,查询的结构如下: SELECT name, SUM(IF(is_correct, 1, 0)) AS correct, SUM(IF(is_correct, 0, 1)) AS wrong FROM k_p AS p JOIN

我正在将一个站点从mysql迁移到PostgreSQL(到目前为止我非常喜欢),但是我有一个关于某个查询的问题。请注意,这不是一个存储函数-这是一个在python脚本中手动传入的字符串(我知道这是一个糟糕的做法,但它仅适用于内部应用程序)。在mysql中,查询的结构如下:

SELECT 
  name,
  SUM(IF(is_correct, 1, 0)) AS correct,
  SUM(IF(is_correct, 0, 1)) AS wrong
FROM
  k_p AS p JOIN
  k_v AS v ON (variable_id=v.id)
WHERE
  content_type_id=%s %s %s
GROUP BY
  v.id
ORDER BY sort_order
is_correct只是一个包含布尔数据的列,可以是0或1。我意识到你不能像在mysql中那样在postgres中直接做IFs。文档似乎建议最好使用case/when语句进行转换。我的实验没有成功。SUM/IF语句让我感到不舒服——查询的其余部分应该没问题。任何建议都将不胜感激

额外问题:如果其中一个问题包括:

 SUM(IF(ISNULL(is_correct), 0, 1)) AS wrong

您想创建
案例
结构:

SELECT 
  name,
  SUM(case when is_correct = 1 then 1 else 0 end) AS correct,
  SUM(case when is_correct = 1 then 0 else 1 end) AS wrong
FROM
  k_p AS p JOIN
  k_v AS v ON (variable_id=v.id)
WHERE
  content_type_id=%s %s %s
GROUP BY
  v.id
ORDER BY sort_order

这看起来很有希望!仅出于测试目的,我运行了“选择SUM(1时大小写正确,然后1,否则0结束)作为k_p的正确值”,并得到了错误“error:operator不存在:boolean=integer”,带有一个箭头,直到时间。知道发生了什么吗?@我以为我很聪明刚刚更新了代码,现在应该可以正常工作了!我想我想出了另一个解决方案——“从k_p中选择SUM(case(cast(is_correct as integer))。哪种方法更“正确”呢?@我认为我很聪明:如果
is\u correct
真的是一个布尔列,那么当is\u correct时你可以使用
case,那么1 else 0 end
select name, correct, wrong
from (
    SELECT 
      id,
      name,
      count(nullif(is_correct, false)) AS correct,
      count(nullif(is_correct, true)) AS wrong
    FROM
      k_p AS p JOIN
      k_v AS v ON (variable_id=v.id)
    WHERE
      content_type_id=%s %s %s
    GROUP BY
      v.id, name
)
ORDER BY sort_order