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ステートメントは、私を失望させているものです。残りのクエリは問題ないはずです。アドバイスをいただければ幸いです。

ボーナス質問:クエリの1つに次のものが含まれている場合、どのように処理しますか?

 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 に答える