簡體   English   中英

MySQL 到 PostgreSQL - 在數組中查找並計算數組值

[英]MySQL to PostgreSQL - Find in array, and count array values

我有一個colors表和一個items表,這兩個表之間存在多對多關系(通過items_colors表)。 一個項目可以有多個 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.

(僅出於此查詢的上下文和目標,我想獲取僅匹配一個或多個提供的 colors (來自提供的顏色數組)的所有項目。如果項目還與未指定的附加顏色相關聯數組,它不應該被檢索.在我上面的例子中,我得到所有與給定數組匹配的項目,所以所有項目都有綠色,或藍色,或綠色和藍色.但是如果一個項目有藍色和紅色 colors(或只有紅色,或沒有顏色),它被排除在結果之外。)

這應該在 Postgres 中工作,假設items.id是主鍵:

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);

我會看一下 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'];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM