PostgreSQL рдПрдВрдЯреАрдкреИрдЯрд░реНрди: SQL рдореЗрдВ рд╕реЗрдЯ рдФрд░ рдЪрдпрди рдкрд╛рд╕ рдХрд░рдирд╛

рд╕рдордп-рд╕рдордп рдкрд░ рдбреЗрд╡рд▓рдкрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕рдВрдкреВрд░реНрдг рдЪрдпрди рдкрд╛рд╕ рдХрд░реЗрдВ "рдкреНрд░рд╡реЗрд╢ рдкрд░"ред рдХрднреА-рдХрднреА рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдмрд╣реБрдд рд╣реА рдЕрдЬреАрдм рд╕рдорд╛рдзрд╛рди рд╣реЛрддреЗ рд╣реИрдВред
PostgreSQL рдПрдВрдЯреАрдкреИрдЯрд░реНрди: SQL рдореЗрдВ рд╕реЗрдЯ рдФрд░ рдЪрдпрди рдкрд╛рд╕ рдХрд░рдирд╛
рдЖрдЗрдП "рд╡рд┐рдкрд░реАрдд рд╕реЗ" рдЪрд▓реЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реИ, рдХреНрдпреЛрдВ рдХрд░рдирд╛ рд╣реИ рдФрд░ рдЖрдк рдЗрд╕реЗ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрдиреБрд░реЛрдз рдирд┐рдХрд╛рдп рдореЗрдВ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдкреНрд░рддреНрдпрдХреНрд╖ "рд╕рдореНрдорд┐рд▓рди"ред

рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

query = "SELECT * FROM tbl WHERE id = " + value

...рдпрд╛ рдЗрд╕ рддрд░рд╣:

query = "SELECT * FROM tbl WHERE id = :param".format(param=value)

рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд╣рд╛, рд▓рд┐рдЦрд╛ рдФрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЦреАрдВрдЪрд╛ рднреА рдЧрдпрд╛ рдкрд░реНрдпрд╛рдкреНрдд:

PostgreSQL рдПрдВрдЯреАрдкреИрдЯрд░реНрди: SQL рдореЗрдВ рд╕реЗрдЯ рдФрд░ рдЪрдпрди рдкрд╛рд╕ рдХрд░рдирд╛

рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рдРрд╕рд╛ рд╣реА рд╣реЛрддрд╛ рд╣реИ 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),...

рдЕрдиреБрд░реЛрдз рдХреЗ "рд░реА-рдЧреНрд▓реВрдЗрдВрдЧ" рдХреЗ рд╕рд╛рде рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рд╣рдореЗрдВ рдЗрд╕ рдУрд░ рднреА рд▓реЗ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рд╕реНрдореГрддрд┐ рд╕реЗ рдмрд╛рд╣рд░ рдФрд░ рд╕рд░реНрд╡рд░ рдХреНрд░реИрд╢ рд╣реЛ рдЧрдпрд╛ред рдХрд╛рд░рдг рд╕рд░рд▓ рд╣реИ - рдкреАрдЬреА рддрд░реНрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдореЗрдореЛрд░реА рд╕реБрд░рдХреНрд╖рд┐рдд рд░рдЦрддрд╛ рд╣реИ, рдФрд░ рд╕реЗрдЯ рдореЗрдВ рд░рд┐рдХреЙрд░реНрдб рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗрд╡рд▓ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рд╢рд▓рд┐рд╕реНрдЯ рджреНрд╡рд╛рд░рд╛ рд╕реАрдорд┐рдд рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдиреИрджрд╛рдирд┐рдХ тАЛтАЛрдорд╛рдорд▓реЛрдВ рдореЗрдВ рдпрд╣ рджреЗрдЦрдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ $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 рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг рд╕реБрд╡рд┐рдзрд╛рдПрдБ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдЖрдкрдХреЗ рдЗрдирдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИрдВ, рддреЛ рдЖрдк рд╡рд╣реАрдВ рдлреЙрд░реНрдо рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ SQL рдХреНрд╡реЗрд░реА рдХреЗ рд▓рд┐рдП json рдСрдмреНрдЬреЗрдХреНрдЯ:

SELECT
  key k
, value v
FROM
  json_each($1::json); -- '{"a":1,"b":2,"c":3,"d":4}'

рдкрд┐рдЫрд▓реЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП, рдЙрд╕реА рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдкреНрд░рддреНрдпреЗрдХ(hstore), рд▓реЗрдХрд┐рди hstore рдореЗрдВ рдЬрдЯрд┐рд▓ рд╡рд╕реНрддреБрдУрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд╕рд╛рде рд╕рд╣реА "рдлреЛрд▓реНрдбрд┐рдВрдЧ" рд╕рдорд╕реНрдпрд╛рдПрдБ рдкреИрджрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

json_populator_recordset

рдпрджрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ "рдЗрдирдкреБрдЯ" рдЬреЗрд╕рди рд╕рд░рдгреА рд╕реЗ рдбреЗрдЯрд╛ рдХреБрдЫ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдПрдЧрд╛, рддреЛ рдЖрдк "рдбреАрд░реЗрдлрд╝рд░реЗрдВрд╕рд┐рдВрдЧ" рдлрд╝реАрд▓реНрдб рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рд╕рд╣реЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ json_poplate_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_рдкреНрд░рдХрд╛рд░, pg_рдирд┐рд░реНрднрд░, 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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ