如何将值从另一个 table 传递给 postgres 中的 jsonb
How to pass value from another table to jsonb in postgres
我有两个table。
Table一个
id | json
----+------------------
a | {"st":[{"State": "TX", "Value":"0.02"}, {"State": "CA", "Value":"0.2" ...
----+------------------
b | {"st":[{"State": "TX", "Value":"0.32"}, {"State": "CA", "Value":"0.47" ...
TableB
idx | state| dir
----+-------+----------
1 | TX | 123
----+-------+----------
2 | CA | 15
我想使用 table B 中的列温度过滤 table A。并且 Table B 将 select 基于 idx 值。
我想 select 当状态等于临时 table 时每一行的值是从 tableB 创建的,其中 idx 是特定数字
假设 idx 等于 2。这意味着我可以使用以下 sql 查询
创建临时 table
with tempT AS(
SELECT *
FROM tableB
where idx = 2);
这就是我想要达到的目标
idx | state| value
----+-------+----------
2 | CA | 0.2
----+-------+----------
2 | CA | 0.47
我该怎么做?
你应该像这样使用jsonb_array_elements:
WITH A AS
(SELECT 'a' AS id,
'{"st":[{"State": "TX", "Value":"0.02"}, {"State": "CA", "Value":"0.2"}]}'::jsonb AS json
UNION SELECT 'b' AS id,
'{"st":[{"State": "TX", "Value":"0.32"}, {"State": "CA", "Value":"0.47"}]}'::jsonb AS json),
B AS
(SELECT 1 AS idx,
'TX' AS state,
123 AS dir
UNION SELECT 2 AS idx,
'CA' AS state,
15 AS dir)
SELECT *
FROM
(SELECT A.id,
jsonb_array_elements(A.json->'st') AS obj
FROM A) AS A
inner JOIN B on B.state = obj->>'State'::text
where B.idx = 2;
我有两个table。
Table一个
id | json
----+------------------
a | {"st":[{"State": "TX", "Value":"0.02"}, {"State": "CA", "Value":"0.2" ...
----+------------------
b | {"st":[{"State": "TX", "Value":"0.32"}, {"State": "CA", "Value":"0.47" ...
TableB
idx | state| dir
----+-------+----------
1 | TX | 123
----+-------+----------
2 | CA | 15
我想使用 table B 中的列温度过滤 table A。并且 Table B 将 select 基于 idx 值。
我想 select 当状态等于临时 table 时每一行的值是从 tableB 创建的,其中 idx 是特定数字
假设 idx 等于 2。这意味着我可以使用以下 sql 查询
创建临时 tablewith tempT AS(
SELECT *
FROM tableB
where idx = 2);
这就是我想要达到的目标
idx | state| value
----+-------+----------
2 | CA | 0.2
----+-------+----------
2 | CA | 0.47
我该怎么做?
你应该像这样使用jsonb_array_elements:
WITH A AS
(SELECT 'a' AS id,
'{"st":[{"State": "TX", "Value":"0.02"}, {"State": "CA", "Value":"0.2"}]}'::jsonb AS json
UNION SELECT 'b' AS id,
'{"st":[{"State": "TX", "Value":"0.32"}, {"State": "CA", "Value":"0.47"}]}'::jsonb AS json),
B AS
(SELECT 1 AS idx,
'TX' AS state,
123 AS dir
UNION SELECT 2 AS idx,
'CA' AS state,
15 AS dir)
SELECT *
FROM
(SELECT A.id,
jsonb_array_elements(A.json->'st') AS obj
FROM A) AS A
inner JOIN B on B.state = obj->>'State'::text
where B.idx = 2;