2

我正在将一个站点从 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 中做直接的 IF。文档似乎表明最好的转换是使用 case/when 语句。我试过没有成功。SUM/IF 语句让我失望——查询的其余部分应该没问题。任何建议将不胜感激!

奖励问题:如果其中一个查询包括:

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

2 回答 2

5

你想要你的CASE构造:

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
于 2012-06-11T15:39:48.073 回答
1
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
于 2012-06-11T17:19:24.250 回答