私はおそらくこれについて間違って考えているだけだと知っています。私は次の構造を持っています:
CREATE TABLE mytable (
id serial PRIMARY KEY
, employee text UNIQUE NOT NULL
, data jsonb
);
そして、次のデータ:
INSERT INTO mytable (employee, data)
VALUES
('Jim', '{"sales": [{"value": 10, "yr": "2010"}, {"value": 5, "yr": "2011"}, {"value": 40, "yr": "2012"}]}'),
('Rob', '{"sales": [{"value": 10, "yr": "2009"}, {"value": 5, "yr": "2010"}, {"value": 41, "yr": "2011"}]}')
すべての従業員と 2012 年の売上の「値」を返そうとしています。2012 年の売上がない場合は、「データなし」を返します。私は持っている:
SELECT id, employee,
coalesce((SELECT s.value AS value FROM mytable, jsonb_to_recordset(mytable.data->'sales') AS s(yr text, value float)
WHERE s.yr='2012'), 0) AS b FROM mytable
私は得る:
id |employee |b
53 |Jim |40
54 |Rob |40
「Rob」の値が間違っています。「データなし」である必要があります。(「倍精度型の入力構文が無効です: 'No Data'」というエラーが表示されるため、coalesce の 2 番目のパラメーターとして 0 を使用しています。