如何将值从另一个 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;