簡體   English   中英

Postgres 加入 Json 數組與 bigint 列

[英]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是必要的,因為數組courseidsTEXT數組,而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.

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