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