2017-04-18 56 views
-1

有列(User_ID,A_D)的表。 A_D列是jsonb。比較jsonb中的2個數組成員數

User_ID | A_D 
1 | "{"agreements": [1, 7], "disagreements": [13]}" 
2 | "{"disagreements": [13, 100]}" 
4 | "{"agreements": [14, 177, 22], "disagreements": [3, 2]}" 
5 | "{"agreements": [77]}" 
6 | "{"agreements": [24, 14, 89, 102], "disagreements": [200]}" 

我需要讓用戶,誰在「協議」陣列更多的成員比「分歧」陣列。

這些用戶ID必須返回

1 
4 
5 
6 
+1

你可以直接使用['json [b] _array_length()'函數(s)](https://www.postgresql.org/docs/current/static/functions-json.html),如: 'jsonb_array_length(A_D - >'agreements')> jsonb_array_length(A_D - >'disagreements')' – pozs

+0

@pozs - 我錯過了這個功能,我想你應該把它作爲答案 –

+0

@OtoShavadze是的,可能。但是我通常猶豫不決,就像這樣簡單。我很想看到來自OP的一些[更多的努力](https://meta.stackoverflow.com/questions/261592/how-much-research-effort-is-expected-of-stack-overflow-users)。 – pozs

回答

0

如果我理解正確的,你需要這樣的:

select t1.User_ID, t1.cnt, t2.cnt from (
    select User_ID, count(*) as cnt from ( 
     select User_ID, jsonb_array_elements_text(a_d->'agreements') from your_table 
    ) arr1 
    GROUP BY User_ID 
) t1 
LEFT JOIN (
    select User_ID, count(*) as cnt from ( 
     select User_ID, jsonb_array_elements_text(a_d->'disagreements') from your_table 
    ) arr2 
    GROUP BY User_ID 
) t2 
ON t1.User_ID = t2.User_ID 
where coalesce(t1.cnt, 0) > coalesce(t2.cnt, 0)