แแ แแแแแ แ, แแแแแแแแแ แก แกแญแแ แแแแ แแแแแกแชแแก แแแ แแแแขแ แแแแก แแแแ แแแ แแ แแฃแแแแช แแแแแ แแ แฉแแแแแ แแแแฎแแแแแแ "แจแแกแแกแแแแแแแ". แแแแฏแแ แแ แแ แแแแแแแก แซแแแแแ แฃแชแแแฃแ แ แแแแแฌแงแแแขแแแแแแแ แแ แกแแแแแก.
แแแแแ แฌแแแแแแ "แกแแแแ แแกแแแ แแแแ" แแ แแแแฎแแ, แ แแแแ แแ แฃแแแ แแแแแแแแแ แแก, แ แแขแแ แแ แ แแแแ แจแแแแซแแแแ แแแแก แแแแแแแแ แฃแแแแแกแแ.
แแแแจแแแแแแแแแแก แแแ แแแแแ แ "แฉแแกแแ" แแแแฎแแแแแก แกแฎแแฃแแจแ
แฉแแแฃแแแแ แแ แแกแ แแแแแแงแฃแ แแแ:
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-แจแ แ แแฃแแ แแแแแฅแขแแแแก แแแฅแชแแแแ แกแฌแแ แแ โแแแแแชแแแโ แจแแแซแแแแ แแแแแแฌแแแแก แแ แแแแแแแแ.
json_populate_recordset
แแฃ แฌแแแแกแฌแแ แแชแแ, แ แแ แแแแแชแแแแแ โแจแแงแแแแแกโ json แแแกแแแแแแ แฌแแแ แ แแแแแแแ แชแฎแ แแแแก แจแแกแแแกแแแแ, แจแแแแซแแแแ แแแแ แ แแแแแแแ แแแแแแจแ โแแแแแ แแแแแโ แแ แแแแแแขแแแแ แกแแกแฃแ แแแ แขแแแแแแ 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-แจแ แแ แแแแแแแก แแแ แแแแ แแแแแงแแแแแฃแแ แแ แแแแแ แแแแ แแชแแแก แจแแแแแแแแก.
แ แ แแฅแแ แฃแแแ, แแแแกแแแ แแ แซแแแ แจแแแซแแแแ แแแ แแแแฃแแ แแแแแ VACUUM FULL แกแแกแขแแแแก แแแขแแแแแแก แชแฎแ แแแแแแก แแแฎแแแแแ.
แกแแกแแแก แชแแแแแแแ
แแแแฃแจแแแ, แฌแแแ แจแแแแฎแแแแแก แแแแแชแแแแแแก แแแแฃแจแแแแแ แกแแแแแแ แ แแฃแแแ แแ แแ 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