ืืขืช ืืขืช, ืืืื ืฆืจืื ืืืขืืืจ ืงืืืฆื ืฉื ืคืจืืืจืื ืื ืืคืืื ืืืืจื ืฉืืื ืืืงืฉื "ืืื ืืกื". ืืคืขืืื ืืฉ ืคืชืจืื ืืช ืืืืจืื ืืืื ืืืขืื ืืื.
ืืื ื ืื "ืืืืคื" ืื ืจืื ืืื ืื ืขืืฉืื ืืช ืื, ืืื ืืืื ืืคืฉืจ ืืขืฉืืช ืืช ืื ืืื ืืืชืจ.
"ืืื ืกื" ืืฉืืจื ืฉื ืขืจืืื ืืืืฃ ืืืงืฉื
ืืืจื ืืื ืื ื ืจืื ืืขืจื ืื:
query = "SELECT * FROM tbl WHERE id = " + value
... ืื ืืื:
query = "SELECT * FROM tbl WHERE id = :param".format(param=value)
ืขื ืฉืืื ืื ื ืืืจ, ืืชืื ื
ืืืขื ืชืืื ืื ืื ื ืชืื ืืฉืืจ ืืืืจืงืช SQL ืืขืืืก ื ืืกืฃ ืขื ืืืืืืื ืืขืกืงื, ืฉื ืืืฅ "ืืืืืืง" ืืช ืืืจืืืช ืืฉืืืืชืืช ืฉืื.
ืืืฉื ืื ืืืืื ืืืืืช ืืืฆืืงืช ืืืงืืช ืจืง ืืืืืช ืืฆืืจื. ืืืฉืชืืฉ ืืืืืฆืืช ื-PostgreSQL ืืจืกืืืช 10 ืืืื ืืชืืื ืืช ืืขืืื ืืืชืจ. ืืืจืกืืืช ืืื, ืจืฉืืืช ืืงืืขืื ืืกืจืืงืื ื ืงืืขืช ืืื ืืชืืฉืืืช ืืคืจืืืจืื ืืืืขืืจืื, ืจืง ืขื ืืกืืก ืืืฃ ืืืงืฉื.
$n ืืืขืื ืื
ืืืฉืชืืฉ
ืืกืคืจ ืืฉืชื ื ืฉื ืืจืืืื ืืื
ืืขืืืช ืืืื ืื ื ืืืฉืจ ื ืจืฆื ืืืขืืืจ ืืกืคืจ ืื ืืืืข ืฉื ืืืขืื ืื ืืจืืฉ:
... id IN ($1, $2, $3, ...) -- $1 : 2, $2 : 3, $3 : 5, ...
ืื ืชืฉืืืจ ืืช ืืืงืฉื ืืืืคืก ืืื, ืื ืืืจืืช ืฉืื ืืืกืื ืืืชื ื ืืืืจืงืืช ืคืืื ืฆืืืืืืช, ืื ืขืืืื ืืืืื ืืฆืืจื ืืืืืืง/ืื ืชื ืืช ืืืงืฉื ืขืืืจ ืื ืืคืฉืจืืช ืืืกืคืจ ืืืจืืืื ืืื. ืืืจ ืืืชืจ ืืื ืืืฉืจ ืืขืฉืืช ืืช ืื ืืื ืคืขื, ืืื ืืชื ืืืื ืืืกืชืืจ ืืืขืืื.
ืื ืืกืคืืง ืืื ืืืขืืืจ ืจืง ืคืจืืืจ ืืื ืืืืื ืืืฆืื ืกืืจืชื ืฉื ืืขืจื:
... id = ANY($1::integer[]) -- $1 : '{2,3,5,8,13}'
ืืืืื ืืืืื ืืื ืืฆืืจื ืืืืืจ ืืืคืืจืฉ ืืช ืืืจืืืื ื ืืกืื ืืืขืจื ืืจืฆืื. ืืื ืื ืื ืืืจื ืืืขืืืช, ืฉืื ืื ืื ื ืืืจ ืืืืขืื ืืจืืฉ ืืื ืื ืื ื ืคืื ืื.
ืืขืืจื ืืืืืื (ืืืจืืงืก)
ืืืจื ืืื ืืื ืื ืืื ื ืืคืฉืจืืืืช ืืืขืืจืช ืืขืจืื ื ืชืื ืื ืืืืกืคื ืืืกื ืื ืชืื ืื "ืืืงืฉื ืืืช":
INSERT INTO tbl(k, v) VALUES($1,$2),($3,$4),...
ืื ืืกืฃ ืืืขืืืช ืฉืชืืืจื ืืขืื ื"ืืืืงื ืืืืฉ" ืฉื ืืืงืฉื, ืื ืื ืืืื ืืืืืื ืืืชื ื ืืชืื ืืืืจืื ืืงืจืืกืช ืฉืจืช. ืืกืืื ืคืฉืืื - PG ืฉืืืจืช ืืืืจืื ื ืืกืฃ ืขืืืจ ืืืจืืืื ืืื, ืืืกืคืจ ืืจืฉืืืืช ืืกื ืืืืื ืจืง ืขื ืืื ืืืฉืื ืืืืืืงื ืืขืกืงืืช Wishlist. ืืืงืจืื ืงืืื ืืื ืืืืืื ืืื ืฆืืจื ืืจืืืช ืืืขืื ืื "ืืืืกืคืจืื" ืืืืืืื ื-$9000 - ืื ืชืขืฉื ืืืช.
ืืื ื ืฉืืชื ืืช ืืฉืืืืชื, ื ืืื ืืืจ ืกืืจื "ืื-ืืคืืกืืช".:
INSERT INTO tbl
SELECT
unnest[1]::text k
, unnest[2]::integer v
FROM (
SELECT
unnest($1::text[])::text[] -- $1 : '{"{a,1}","{b,2}","{c,3}","{d,4}"}'
) T;
ืื, ืืืงืจื ืฉื ืขืจืืื "ืืืจืืืื" ืืชืื ืืขืจื, ืื ืฆืจืืืื ืืืืืช ืืืืกืืจืื ืขื ืืจืืืืช.
ืืจืืจ ืฉืืืจื ืื ื ืืชื "ืืืจืืื" ืืช ืืืืืจื ืืืกืคืจ ืฉืืืช ืฉืจืืจืืชื.
ืื-ืฉืงื, ืื-ืฉืงื,โฆ
ืืขืช ืืขืช ืืฉ ืืืคืฆืืืช ืืืขืืจ ืืืงืื "ืืขืจื ืืขืจืืื" ืืื "ืืขืจืื ืขืืืืืช" ืฉืฆืืื ืชื
SELECT
unnest($1::text[]) k
, unnest($2::integer[]) v;
ืืฉืืื ืื, ืื ืืชื ืขืืฉื ืืขืืช ืืขืช ืืฆืืจืช ืจืฉืืืืช ืขืจืืื ืขืืืจ ืขืืืืืช ืฉืื ืืช, ืงื ืืืื ืืงืื ืืืืืืื ืชืืฆืืืช ืืืชื ืฆืคืืืืช, ืฉืชืืื ืื ืืืจืกืช ืืฉืจืช:
-- $1 : '{a,b,c}', $2 : '{1,2}'
-- PostgreSQL 9.4
k | v
-----
a | 1
b | 2
c | 1
a | 2
b | 1
c | 2
-- PostgreSQL 11
k | v
-----
a | 1
b | 2
c |
JSON
ืืื ืืืจืกื 9.3, ื-PostgreSQL ืืฉ ืคืื ืงืฆืืืช ืืืืืช ืืขืืืื ืขื ืกืื json. ืืื, ืื ืคืจืืืจื ืืงืื ืฉืื ืืืืืจืื ืืืคืืคื, ืืชื ืืืื ืืืฉ ืฉื ืืืืฆืืจ ืืืืืืงื json ืขืืืจ ืฉืืืืชืช SQL:
SELECT
key k
, value v
FROM
json_each($1::json); -- '{"a":1,"b":2,"c":3,"d":4}'
ืขืืืจ ืืจืกืืืช ืงืืืืืช, ื ืืชื ืืืฉืชืืฉ ืืืืชื ืฉืืื ืขืืืจ ืื (hstore), ืืื "ืงืืคืื" ื ืืื ืขื ืืืืืืงืืื ืืืจืืืื ืฉื ืืืืื ื-hstore ืขืืื ืืืจืื ืืืขืืืช.
json_populate_recordset
ืื ืืชื ืืืืข ืืจืืฉ ืฉืื ืชืื ืื ืืืขืจื "input" json ืืขืืจื ืืืืืื ืืืื ืืืฉืื, ืชืืื ืืืกืื ืืจืื ืืฉืืืช "dereferencing" ืืืขืืจื ืืกืืืื ืืจืฆืืืื ืืืืฆืขืืช ืืคืื ืงืฆืื json_populate_recordset:
SELECT
*
FROM
json_populate_recordset(
NULL::pg_class
, $1::json -- $1 : '[{"relname":"pg_class","oid":1262},{"relname":"pg_namespace","oid":2615}]'
);
json_to_recordset
ืืคืื ืงืฆืื ืื ืคืฉืื "ืชืจืืื" ืืช ืืขืจื ืืืืืืืงืืื ืืืืขืืจ ืืืืืจื, ืืืื ืืืกืชืื ืขื ืคืืจืื ืืืืื:
SELECT
*
FROM
json_to_recordset($1::json) T(k text, v integer);
-- $1 : '[{"k":"a","v":1},{"k":"b","v":2}]'
k | v
-----
a | 1
b | 2
ืฉืืืื ืืื ื
ืืื ืื ืืืืช ืื ืชืื ืื ืืืืืื ืืืฉืืืจืช ืืืืื ืืืื, ืืื ืืืจืืง ืืืชื ืืคืจืืืจ ืืกืืืจ ืืื ืงืฉื, ืืืคืขืืื ืืืชื ืืคืฉืจืืช, ืืืืืื ืฉืืื ืืืจืฉืช ืื ืคืขืื ืืงืฆืืช ืืืืจืื ืืืืื. ืืืืืื, ืืชื ืฆืจืื ืืืกืืฃ ืืฆืืื ืืืืื ืฉื ื ืชืื ื ืืืจืืขืื ืืืขืจืืช ืืืฆืื ืืช ืืืฉื ืืื ืจื, ืืื ืืชื ืจืืฆื ืืขืื ืืืชื ืื ืคืขืื ืืฆื ืืกืืก ืื ืชืื ืื.
ืืืงืจื ืื, ืืคืชืจืื ืืืื ืืืืชืจ ืืืื ืืืฉืชืืฉ
CREATE TEMPORARY TABLE tbl(k text, v integer);
...
INSERT INTO tbl(k, v) VALUES($1, $2); -- ะฟะพะฒัะพัะธัั ะผะฝะพะณะพ-ะผะฝะพะณะพ ัะฐะท
...
-- ััั ะดะตะปะฐะตะผ ััะพ-ัะพ ะฟะพะปะตะทะฝะพะต ัะพ ะฒัะตะน ััะพะน ัะฐะฑะปะธัะตะน ัะตะปะธะบะพะผ
ืืฉืืื ืืืื ืืฉืืืืจ ื ืืืจ ืฉื ื ืคืืื ืืืืืื ื ืชืื ืื.
ืื ืงืืืช ืืืื ืฉื ืชืืืืจ ืืื ื ืื ืชืื ืื ืฉืื, ืืืื ืืื ืืช ืฉืื ื ืืืืื "ืจืืืื" ืืชืืื ื ืืืช ืืืื. ืืืืืช ืืขืจืืช pg_class, ืืขืื ื pg_type, pg_depend, pg_attribute, pg_attrdef, ... - ืืืืื ืืืื.
ืืื, ืืืขืจืืืช ืืื ืืจื ื ืขื ืืกืคืจ ืจื ืฉื ืืืืืจืื ืงืฆืจื ืืืขื ืืื ืืื ืืื, ืืืื ืืื ืชืืืฆืจ ืืื ืคืขื ืจืฉืืืืช ืืขืจืืช ืืืฉืืช, ืืฉืจ ื ืืืงืืช ืขื ืกืืืจืช ืืืืืืจ ืืืกื ืื ืชืื ืื. ืืกืืคื ืฉื ืืืจ, ืฉืืืืฉ ืื ืืืืงืจ ื-TEMP TABLE ืืืืื ื"ื ืคืืืืช" ืฉื ืืืืืืช ื-pg_catalog ืืืืืช ืคืขืืืืช ืจืืืช ืืืฉืชืืฉืืช ืืื.
ืืืืื ืฉืืคืฉืจ ืืืืืื ืืื ืืขืืจ ืชืงืืคืชื ืืืงืื ืืื ืืคื ืืืืืืช ืงืืืื ืืืขืจืืช.
ืืฉืชื ื ืืคืขืื
ื ื ืื ืฉืืขืืืื ืฉื ืื ืชืื ืื ืืืืงืจื ืืงืืื ืืื ืื ืืืจืื ืขืืืจ ืฉืืืืชืช SQL ืืืืืช, ืืื ืืชื ืจืืฆื ืืขืฉืืช ืืช ืื ืืขืชืื ืงืจืืืืช ืืืื. ืืืืืจ, ืื ืื ื ืจืืฆืื ืืืฉืชืืฉ ืืขืืืื ืคืจืืฆืืืจืื ื
ืื ืื ื ืื ืื ืืืืืื ืืืฉืชืืฉ ื-$n-ืคืจืืืจืื ืืื ืืขืืืจ ืืืืืง ืื ืื ืืื. ืืฉืชื ื ืืคืืืฉื ืืืคืื ืงืฆืื ืืขืืจื ืื ื ืืฆืืช ืืืืฆื. ืืืืืจื ืื ืืืืืช.
ืืคื ื ืืจืกื 9.2, ืืื ืขืืื ืืืืืืจ ืืจืืฉ
SET my.val = '{1,2,3}';
DO $$
DECLARE
id integer;
BEGIN
FOR id IN (SELECT unnest(current_setting('my.val')::integer[])) LOOP
RAISE NOTICE 'id : %', id;
END LOOP;
END;
$$ LANGUAGE plpgsql;
-- NOTICE: id : 1
-- NOTICE: id : 2
-- NOTICE: id : 3
ืืฉื ื ืคืชืจืื ืืช ืืืจืื ืืืื ืื ืืฉืคืืช ืคืจืืฆืืืจืืืืช ื ืชืืืืช ืืืจืืช.
ืืืืจ ืืจืืื ื ืืกืคืืช? ืฉืชืคื ืืชืืืืืช!
ืืงืืจ: www.habr.com