@by_ikar:
/* funkcje pomocnicze */
CREATE FUNCTION json(text, text) RETURNS json AS
$$
SELECT ('{"' || $1 || '":"' || $2 ||'"}')::JSON
$$
LANGUAGE sql IMMUTABLE STRICT
COST 1;
CREATE FUNCTION json_add(json, json) returns json AS
$$
SELECT ('{' || string_agg(to_json("key") || ':' || "value", ',') || '}')::json
FROM
(
SELECT KEY, value::TEXT FROM json_each($1)
UNION
SELECT KEY, value::TEXT FROM json_each($2)
ORDER BY KEY
)sub
$$
LANGUAGE sql IMMUTABLE STRICT
COST 1;
/* tabela */
CREATE TABLE test_87
(
id serial PRIMARY KEY,
pole_json json
)
;
/* index - w 1. zapytaniu z niego korzysta */
CREATE INDEX idx_pole_json ON test_87 (cast(pole_json->'nazwisko' AS text));
/* wartosci */
INSERT INTO test_87(pole_json) VALUES
('{"imie":"ala", "nazwisko":"nowak"}'::json),
('{"imie":"ela", "nazwisko":"kowalska"}'::json),
('{"imie":"tomek", "nazwisko":"wisniewski"}'::json),
('{"imie":"darek", "nazwisko":"grzelak"}'::json),
('{"imie":"marek", "nazwisko":"nowak"}'::json);
/* 1. wybranie po nazwisku */
SELECT pole_json->'imie', pole_json->'nazwisko' FROM test_87 WHERE (pole_json->'nazwisko')::text='"nowak"';
/* 2. update - dodanie plci do JSONa*/
UPDATE test_87 SET pole_json=json_add(pole_json, json('plec', case when (pole_json->'imie')::text LIKE '%a"' then 'k' else 'm' end))
/* 3. grupowanie */
SELECT (pole_json->'plec')::text, count(*), string_agg((pole_json->'imie')::text, ',') FROM test_87 GROUP BY 1