āĻ¸āĻŽāĻ¯āĻŧā§ āĻ¸āĻŽāĻ¯āĻŧā§, āĻŦāĻŋāĻāĻžāĻļāĻāĻžāĻ°ā§āĻ° āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨ āĻ
āĻ¨ā§āĻ°ā§āĻ§ā§ āĻĒā§āĻ¯āĻžāĻ°āĻžāĻŽāĻŋāĻāĻžāĻ°ā§āĻ° āĻāĻāĻāĻŋ āĻ¸ā§āĻ āĻŦāĻž āĻāĻŽāĻ¨āĻāĻŋ āĻāĻāĻāĻŋ āĻ¸āĻŽā§āĻĒā§āĻ°ā§āĻŖ āĻ¨āĻŋāĻ°ā§āĻŦāĻžāĻāĻ¨ āĻĒāĻžāĻ¸ āĻāĻ°ā§āĻ¨ "āĻ
āĻ¨ā§āĻĒā§āĻ°āĻŦā§āĻļ". āĻāĻāĻ¨āĻ āĻāĻāĻ¨āĻ āĻāĻ āĻ¸āĻŽāĻ¸ā§āĻ¯āĻžāĻ° āĻā§āĻŦ āĻ
āĻĻā§āĻā§āĻ¤ āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨ āĻāĻā§āĨ¤
āĻāĻ¸ā§āĻ¨ "āĻŦāĻŋāĻĒāĻ°ā§āĻ¤ āĻĨā§āĻā§" āĻ¯āĻžāĻ¨ āĻāĻŦāĻ āĻĻā§āĻā§āĻ¨ āĻā§āĻāĻžāĻŦā§ āĻāĻāĻŋ āĻāĻ°āĻŦā§āĻ¨ āĻ¨āĻž, āĻā§āĻ¨ āĻāĻŦāĻ āĻā§āĻāĻžāĻŦā§ āĻāĻĒāĻ¨āĻŋ āĻāĻāĻŋ āĻāĻ°āĻ āĻāĻžāĻ˛ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§āĻ¨āĨ¤
āĻ āĻ¨ā§āĻ°ā§āĻ§ā§āĻ° āĻ āĻāĻļā§ āĻŽāĻžāĻ¨āĻā§āĻ˛āĻŋāĻ° āĻ¸āĻ°āĻžāĻ¸āĻ°āĻŋ "āĻ¸āĻ¨ā§āĻ¨āĻŋāĻŦā§āĻļ"
āĻāĻāĻŋ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖāĻ¤ āĻāĻ āĻŽāĻ¤ āĻāĻŋāĻā§ āĻĻā§āĻāĻžāĻ¯āĻŧ:
query = "SELECT * FROM tbl WHERE id = " + value
... āĻŦāĻž āĻāĻ āĻŽāĻ¤:
query = "SELECT * FROM tbl WHERE id = :param".format(param=value)
āĻāĻ āĻĒāĻĻā§āĻ§āĻ¤āĻŋ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻā§ āĻŦāĻ˛āĻž āĻšāĻ¯āĻŧ, āĻ˛āĻŋāĻāĻŋāĻ¤ āĻāĻŦāĻ
āĻĒā§āĻ°āĻžāĻ¯āĻŧ āĻ¸āĻŦāĻ¸āĻŽāĻ¯āĻŧ āĻāĻāĻž āĻšāĻ¯āĻŧ āĻāĻ¸āĻāĻŋāĻāĻāĻ˛ āĻāĻ¨āĻā§āĻāĻļāĻ¨ā§āĻ° āĻ¸āĻ°āĻžāĻ¸āĻ°āĻŋ āĻĒāĻĨ āĻāĻŦāĻ āĻŦā§āĻ¯āĻŦāĻ¸āĻžāĻ¯āĻŧāĻŋāĻ āĻ¯ā§āĻā§āĻ¤āĻŋāĻ° āĻāĻĒāĻ° āĻāĻāĻāĻŋ āĻ
āĻ¤āĻŋāĻ°āĻŋāĻā§āĻ¤ āĻ˛ā§āĻĄ, āĻ¯āĻž āĻāĻĒāĻ¨āĻžāĻ° āĻā§āĻ¯ā§āĻ¯āĻŧāĻžāĻ°ā§ āĻ¸ā§āĻā§āĻ°āĻŋāĻāĻā§ "āĻāĻ āĻž" āĻāĻ°āĻ¤ā§ āĻŦāĻžāĻ§ā§āĻ¯ āĻāĻ°āĻž āĻšāĻ¯āĻŧāĨ¤
āĻāĻ āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻ° āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨ āĻšāĻ˛ā§āĻ āĻāĻāĻļāĻŋāĻāĻāĻžāĻŦā§ āĻ¨ā§āĻ¯āĻžāĻ¯āĻŧāĻ¸āĻā§āĻāĻ¤ āĻšāĻ¤ā§ āĻĒāĻžāĻ°ā§āĨ¤ āĻĒāĻžāĻ°ā§āĻāĻŋāĻļāĻ¨ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§āĻ¨ āĻāĻ°āĻ āĻĻāĻā§āĻˇ āĻĒāĻ°āĻŋāĻāĻ˛ā§āĻĒāĻ¨āĻžāĻ° āĻāĻ¨ā§āĻ¯ 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),...
āĻ āĻ¨ā§āĻ°ā§āĻ§ā§āĻ° "āĻĒā§āĻ¨āĻ°āĻžāĻ¯āĻŧ āĻāĻ āĻžāĻ˛ā§" āĻāĻ° āĻ¸āĻžāĻĨā§ āĻāĻĒāĻ°ā§ āĻŦāĻ°ā§āĻŖāĻŋāĻ¤ āĻ¸āĻŽāĻ¸ā§āĻ¯āĻžāĻā§āĻ˛āĻŋ āĻāĻžāĻĄāĻŧāĻžāĻ, āĻāĻāĻŋ āĻāĻŽāĻžāĻĻā§āĻ°āĻā§āĻ āĻ¨āĻŋāĻ¯āĻŧā§ āĻ¯ā§āĻ¤ā§ āĻĒāĻžāĻ°ā§ āĻā§āĻāĻžāĻ¨ā§āĻ° āĻŦāĻžāĻšāĻŋāĻ°ā§ āĻāĻŦāĻ āĻ¸āĻžāĻ°ā§āĻāĻžāĻ° āĻā§āĻ°ā§āĻ¯āĻžāĻļāĨ¤ āĻāĻžāĻ°āĻŖāĻāĻŋ āĻ¸āĻšāĻ - āĻĒāĻŋāĻāĻŋ āĻāĻ°ā§āĻā§āĻŽā§āĻ¨ā§āĻā§āĻ° āĻāĻ¨ā§āĻ¯ āĻ āĻ¤āĻŋāĻ°āĻŋāĻā§āĻ¤ āĻŽā§āĻŽāĻ°āĻŋ āĻ¸āĻāĻ°āĻā§āĻˇāĻŖ āĻāĻ°ā§, āĻāĻŦāĻ āĻ¸ā§āĻā§ āĻ°ā§āĻāĻ°ā§āĻĄā§āĻ° āĻ¸āĻāĻā§āĻ¯āĻž āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻŦā§āĻ¯āĻŦāĻ¸āĻžāĻ¯āĻŧāĻŋāĻ āĻ˛āĻāĻŋāĻ āĻ ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻā§āĻļāĻ¨ āĻāĻāĻļāĻ˛āĻŋāĻ¸ā§āĻ āĻĻā§āĻŦāĻžāĻ°āĻž āĻ¸ā§āĻŽāĻžāĻŦāĻĻā§āĻ§āĨ¤ āĻŦāĻŋāĻļā§āĻˇ āĻāĻ°ā§ āĻā§āĻ˛āĻŋāĻ¨āĻŋāĻāĻžāĻ˛ āĻā§āĻˇā§āĻ¤ā§āĻ°ā§ āĻāĻāĻŋ āĻĻā§āĻāĻ¤ā§ āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨ āĻāĻŋāĻ˛ "āĻ¸āĻāĻā§āĻ¯āĻžāĻ¯ā§āĻā§āĻ¤" āĻāĻ°ā§āĻā§āĻŽā§āĻ¨ā§āĻ $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 āĻ āĻŦāĻā§āĻā§āĻ:
SELECT
key k
, value v
FROM
json_each($1::json); -- '{"a":1,"b":2,"c":3,"d":4}'
āĻĒā§āĻ°ā§āĻŦāĻŦāĻ°ā§āĻ¤ā§ āĻ¸āĻāĻ¸ā§āĻāĻ°āĻŖāĻā§āĻ˛āĻŋāĻ° āĻāĻ¨ā§āĻ¯, āĻāĻāĻ āĻĒāĻĻā§āĻ§āĻ¤āĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻž āĻ¯ā§āĻ¤ā§ āĻĒāĻžāĻ°ā§ āĻĒā§āĻ°āĻ¤āĻŋāĻāĻŋ (hstore), āĻāĻŋāĻ¨ā§āĻ¤ā§ hstore-āĻ āĻāĻāĻŋāĻ˛ āĻŦāĻ¸ā§āĻ¤ā§ āĻĒāĻžāĻ˛āĻžāĻ¨ā§āĻ° āĻ¸āĻžāĻĨā§ āĻ¸āĻ āĻŋāĻ "āĻāĻžāĻāĻ" āĻ¸āĻŽāĻ¸ā§āĻ¯āĻž āĻ¸ā§āĻˇā§āĻāĻŋ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§āĨ¤
json_populate_recordset
āĻāĻĒāĻ¨āĻŋ āĻ¯āĻĻāĻŋ āĻāĻā§ āĻĨā§āĻā§āĻ āĻāĻžāĻ¨ā§āĻ¨ āĻ¯ā§ "āĻāĻ¨āĻĒā§āĻ" json āĻ ā§āĻ¯āĻžāĻ°ā§ āĻĨā§āĻā§ āĻĄā§āĻāĻž āĻāĻŋāĻā§ āĻā§āĻŦāĻŋāĻ˛ā§ āĻĒā§āĻ°āĻŖ āĻāĻ°āĻ¤ā§ āĻ¯āĻžāĻŦā§, āĻ¤āĻžāĻšāĻ˛ā§ āĻāĻĒāĻ¨āĻŋ json_populate_recordset āĻĢāĻžāĻāĻļāĻ¨ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§ "dereferencing" āĻĢāĻŋāĻ˛ā§āĻĄā§ āĻāĻŦāĻ āĻāĻžāĻ¸ā§āĻāĻŋāĻ āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨ā§āĻ¯āĻŧ āĻĒā§āĻ°āĻāĻžāĻ°āĻā§āĻ˛āĻŋāĻ¤ā§ āĻ āĻ¨ā§āĻ āĻāĻŋāĻā§ āĻ¸āĻāĻ°āĻā§āĻˇāĻŖ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§āĻ¨:
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-āĻ āĻā§āĻŦāĻŋāĻ˛ā§āĻ° "āĻĢā§āĻ˛āĻž"āĻ° āĻĻāĻŋāĻā§ āĻ¨āĻŋāĻ¯āĻŧā§ āĻ¯āĻžāĻ¯āĻŧ āĻāĻŦāĻ āĻ¸ā§āĻā§āĻ˛āĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§ āĻāĻŽāĻ¨ āĻ
āĻ¨ā§āĻāĻā§āĻ˛āĻŋ āĻ
āĻĒāĻžāĻ°ā§āĻļāĻ¨āĻā§ āĻŽāĻ¨ā§āĻĨāĻ° āĻāĻ°ā§āĨ¤
āĻ
āĻŦāĻļā§āĻ¯āĻ, āĻāĻ° āĻ¸āĻžāĻĨā§ āĻ˛āĻĄāĻŧāĻžāĻ āĻāĻ°āĻž āĻ¯ā§āĻ¤ā§ āĻĒāĻžāĻ°ā§ āĻĒāĻ°ā§āĻ¯āĻžāĻ¯āĻŧāĻā§āĻ°āĻŽāĻŋāĻ āĻĒāĻžāĻ¸ āĻā§āĻ¯āĻžāĻā§āĻ¯āĻŧāĻžāĻŽ āĻĒā§āĻ°ā§āĻŖ āĻ¸āĻŋāĻ¸ā§āĻā§āĻŽ āĻā§āĻ¯āĻžāĻāĻžāĻ˛āĻ āĻā§āĻŦāĻŋāĻ˛ āĻ
āĻ¨ā§āĻ¯āĻžāĻ¯āĻŧā§.
āĻ¸ā§āĻļāĻ¨ āĻā§āĻ°āĻŋāĻ¯āĻŧā§āĻŦāĻ˛
āĻ§āĻ°ā§āĻ¨ āĻĒā§āĻ°ā§āĻŦāĻŦāĻ°ā§āĻ¤ā§ āĻā§āĻ¸ āĻĨā§āĻā§ āĻĄā§āĻāĻž āĻĒā§āĻ°āĻā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻāĻ°āĻŖ āĻāĻāĻāĻŋ āĻāĻāĻ āĻāĻ¸āĻāĻŋāĻāĻāĻ˛ āĻā§āĻ¯āĻŧā§āĻ°āĻŋāĻ° āĻāĻ¨ā§āĻ¯ āĻŦā§āĻļ āĻāĻāĻŋāĻ˛, āĻāĻŋāĻ¨ā§āĻ¤ā§ āĻāĻĒāĻ¨āĻŋ āĻāĻāĻŋ āĻĒā§āĻ°āĻžāĻ¯āĻŧāĻļāĻ āĻāĻ°āĻ¤ā§ āĻāĻžāĻ¨āĨ¤ āĻ
āĻ°ā§āĻĨāĻžā§, āĻāĻŽāĻ°āĻž āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻāĻ¤ āĻĒā§āĻ°āĻā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻāĻ°āĻŖ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻ¤ā§ āĻāĻžāĻ
āĻāĻŽāĻ°āĻž āĻāĻāĻāĻŋ āĻŦā§āĻ¨āĻžāĻŽā§ āĻŦā§āĻ˛āĻā§ āĻĒāĻžāĻ¸ āĻāĻ°āĻ¤ā§ $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