我有一个colors
表和一个items
表,在这两个表之间有一个多到多个关系(通过items_colors
表)。一个项目可以有多个颜色,一个颜色可以有多个项目。
items
id
colors
id
name
items_colors
item_id [foreign key: items(id)]
color_id [foreign key: colors(id)]
我目前正在从MySQL迁移到PostgreSQL。下面这个SQL查询在MySQL中运行良好,但我无法使它在PostgreSQL上工作:
SELECT i.*
FROM
items i
JOIN items_colors ic ON ic.item_id = i.id
JOIN colors c ON c.id = ic.color_id
GROUP BY i.id
HAVING COUNT(*) = SUM( c.name IN ('green', 'blue') )
A还试图以不同的方式表达HAVING
:
HAVING SUM( c.name NOT IN ('green', 'blue') ) = 0;
在所有情况下,对于PostgreSQL,我都会得到以下错误:
Query 1 ERROR: ERROR: function sum(boolean) does not exist
LINE 7: HAVING COUNT(*) = SUM( c.name IN ('green'...
^
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
(只是为了这个查询的上下文和目标,我希望获得所有只匹配一个或多个提供的颜色的项(从提供的颜色数组)。如果项还与数组中未指定的附加颜色相关联,则不应检索该颜色。在上面的示例中,我将获得与给定数组匹配的所有项,因此所有具有绿色、蓝色或绿色和蓝色的项目。但是--如果一个项目有蓝色和红色(或者只有红色,或者没有颜色),它将被排除在结果之外。
发布于 2021-02-10 03:55:46
假设items.id
是主键,这应该适用于Postgres:
SELECT i.*
FROM items i JOIn
items_colors ic
ON ic.item_id = i.id JOIN
colors c
ON c.id = ic.color_id
GROUP BY i.id
HAVING COUNT(*) = SUM( (c.name IN ('green', 'blue'))::INT );
或者:
HAVING COUNT(*) = COUNT(*) FILTER (WHERE c.name IN ('green', 'blue'))
在这两个数据库中工作的版本是:
HAVING COUNT(*) = SUM(CASE WHEN c.name IN ('green', 'blue') THEN 1 ELSE 0 END);
发布于 2021-02-10 04:09:23
我想看看数组运算符 in PostgreSQL:
SELECT i.*
FROM
items i
JOIN items_colors ic ON ic.item_id = i.id
JOIN colors c ON c.id = ic.color_id
GROUP BY i.id
HAVING ARRAY_AGG(c.name) <@ ARRAY['green', 'blue'];
https://stackoverflow.com/questions/66136335
复制相似问题