[英]Postgres join on Json Array with bigint column
我正在嘗試將包含 json 數組數據的表加入到一個具有 bigint 列的表中,例如: '["1", "2", "3"]'
。 我無法找到解決方案
類別
name courseids(JSON Array)
name123 ["1", "2", "3"]
name321 ["4", "8", "10"]
課程
id name
1 coursename
2 coursename
3 coursename
預計:
course_name category_name
........... .............
嘗試在子查詢或CTE
中的數組中使用UNEST
,然后從那里將它與表課程一起JOIN
,例如
CREATE TEMPORARY TABLE category (name TEXT, courseids JSONB);
INSERT INTO category VALUES ('name123','["1", "2", "3"]'),('name321','["4", "8", "10"]');
CREATE TEMPORARY TABLE course (id INT, name TEXT);
INSERT INTO course VALUES (1,'course1'),(2,'course2'),(3,'course3');
WITH j (name,courseid) AS (
SELECT name,jsonb_array_elements(courseids)->>0
FROM category cat
)
SELECT j.name AS course_name, c.name AS category_name FROM j
JOIN course c ON c.id::TEXT = j.courseid;
course_name | category_name
-------------+---------------
name123 | course1
name123 | course2
name123 | course3
演示: db<>fiddle
注意:強制轉換c.id::TEXT
是必要的,因為數組courseids
是TEXT
數組,而id
在 course 是BIGINT
。
由於您的 JSON 數組包含字符串而不是數字,您可以使用contains 運算符加入?
將course.id
轉換為文本值后。 運算符檢查數組是否包含右側的值。
select cat.name as category_name, co.name as course_name
from category cat
join course co on cat.courseids ? co.id::text
order by cat.name
?
運算符僅適用於jsonb
列。 如果您的列被定義為一個(應該是),您還需要轉換該列:
join course co on cat.courseids::jsonb ? co.id::text
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.