我正在嘗試撰寫一個查詢來匹配 postgres 陣列中的多個元素
| 陣列1 | 陣列2 | 多個元素匹配 |
|---|---|---|
| A B C D | 一種 | 錯誤的 |
| A B C D | 一、二 | 真的 |
| A B C D | 一、二、三 | 真的 |
| A B C D | 廣告 | 真的 |
| A B C D | 高手 | 真的 |
| A B C D | A B C D | 真的 |
| A B C D | a,b,e,d,f | 真的 |
| A B C D | a,z,e,f,g,h | 錯誤的 |
我嘗試了所有這些操作https://www.postgresql.org/docs/current/functions-array.html
有沒有內置的方法來做到這一點?
uj5u.com熱心網友回復:
在標量子查詢中取消嵌套并連接陣列;計算結果行數并檢查它是否大于 1。
select array1, array2,
(
select count(*)
from unnest(array1) t1
join unnest(array2) t2 on t1 = t2
) > 1
from the_table;
這是如果陣列元素是唯一的并且陣列中元素的順序無關緊要。
更新
為了使其與重復陣列元素正常作業替換
unnest(arrayx) tx為(select distinct t from unnest(arrayx) t) tx
select array1, array2,
(
select count(*)
from (select distinct t from unnest(array1) t) t1
join (select distinct t from unnest(array2) t) t2 on t1 = t2
) > 1 from the_table;
uj5u.com熱心網友回復:
撰寫一個子查詢并在其中取消嵌套兩個陣列,然后與所有元素進行交叉連接,例如
SELECT
array1, array2,
(SELECT count(*) FILTER (WHERE el1 = el2)
FROM unnest(t1.array1) a1(el1), unnest(t1.array2)a2(el2)) > 1
FROM t t1;
編輯(請參閱下面的評論):如果陣列元素確實重復(與給定的資料樣本相反)并且您希望只計算一次重疊,只需使用另一個子查詢取消嵌套陣列DISTINCT,例如
SELECT
array1, array2,
(SELECT count(*) FILTER (WHERE el1 = el2)
FROM (SELECT DISTINCT unnest(t1.array1)) a1(el1),
(SELECT DISTINCT unnest(t1.array2)) a2(el2)) > 1
FROM t t1;
演示: db<>fiddle
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/355171.html
標籤:sql PostgreSQL
