PostgreSQL เชเชจเซเชŸเชฟเชชเซ‡เชŸเชฐเซเชจ: เชธเซ‡เชŸ เชชเชพเชธ เช•เชฐเซ€เชจเซ‡ SQL เชชเชฐ เชชเชธเช‚เชฆ เช•เชฐเซ‡ เช›เซ‡

เชธเชฎเชฏ เชธเชฎเชฏ เชชเชฐ เชตเชฟเช•เชพเชธเช•เชฐเซเชคเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ เชตเชฟเชจเช‚เชคเชฟ เชฎเชพเชŸเซ‡ เชชเชฐเชฟเชฎเชพเชฃเซ‹เชจเซ‹ เชธเชฎเซ‚เชน เช…เชฅเชตเชพ เชธเช‚เชชเซ‚เชฐเซเชฃ เชชเชธเช‚เชฆเช—เซ€ เชชเชฃ เชชเชธเชพเชฐ เช•เชฐเซ‹ "เชชเซเชฐเชตเซ‡เชถ เชฆเซเชตเชพเชฐ เชชเชฐ". เช•เซ‡เชŸเชฒเซ€เช•เชตเชพเชฐ เชคเชฎเซ‡ เช† เชธเชฎเชธเซเชฏเชพ เชฎเชพเชŸเซ‡ เช–เซ‚เชฌ เชœ เชตเชฟเชšเชฟเชคเซเชฐ เช‰เช•เซ‡เชฒเซ‹ เช†เชตเซ‹ เช›เซ‹.
PostgreSQL เชเชจเซเชŸเชฟเชชเซ‡เชŸเชฐเซเชจ: เชธเซ‡เชŸ เชชเชพเชธ เช•เชฐเซ€เชจเซ‡ SQL เชชเชฐ เชชเชธเช‚เชฆ เช•เชฐเซ‡ เช›เซ‡
เชšเชพเชฒเซ‹ เชชเชพเช›เชณ เชœเชˆเช เช…เชจเซ‡ เชœเซ‹เชˆเช เช•เซ‡ เชถเซเช‚ เชจ เช•เชฐเชตเซเช‚ เชœเซ‹เชˆเช, เชถเชพ เชฎเชพเชŸเซ‡ เช…เชจเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช†เชชเชฃเซ‡ เชคเซ‡เชจเซ‡ เชตเชงเซ เชธเชพเชฐเซ€ เชฐเซ€เชคเซ‡ เช•เชฐเซ€ เชถเช•เซ€เช.

เชตเชฟเชจเช‚เชคเซ€เชจเชพ เชฎเซเช–เซเชฏ เชญเชพเช—เชฎเชพเช‚ เชฎเซ‚เชฒเซเชฏเซ‹เชจเซเช‚ เชธเซ€เชงเซเช‚ เชจเชฟเชตเซ‡เชถ

เชคเซ‡ เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡ เช•เช‚เชˆเช• เช†เชจเชพ เชœเซ‡เชตเซเช‚ เชฒเชพเช—เซ‡ เช›เซ‡:

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

...เช…เชฅเชตเชพ เช†เชจเชพ เชœเซ‡เชตเซเช‚:

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

เช† เชชเชฆเซเชงเชคเชฟ เช•เชนเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเซ€ เช›เซ‡, เชฒเซ‡เช–เชฟเชค เช…เชจเซ‡ เชฆเซ‹เชฐเซ‡เชฒเชพ เชชเชฃ เชชเซเชทเซเช•เชณ:

PostgreSQL เชเชจเซเชŸเชฟเชชเซ‡เชŸเชฐเซเชจ: เชธเซ‡เชŸ เชชเชพเชธ เช•เชฐเซ€เชจเซ‡ 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 เชฆเชฒเซ€เชฒเซ‹ เชฎเชพเชŸเซ‡ เชตเชงเชพเชฐเชพเชจเซ€ เชฎเซ‡เชฎเชฐเซ€ เช…เชจเชพเชฎเชค เชฐเชพเช–เซ‡ เช›เซ‡, เช…เชจเซ‡ เชธเชฎเซ‚เชนเชฎเชพเช‚ เชฐเซ‡เช•เซ‹เชฐเซเชกเซเชธเชจเซ€ เชธเช‚เช–เซเชฏเชพ เชซเช•เซเชค เชตเซเชฏเชตเชธเชพเชฏเชฟเช• เชคเชฐเซเช•เชจเซ€ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชœเชฐเซ‚เชฐเชฟเชฏเชพเชคเซ‹ เชฆเซเชตเชพเชฐเชพ เชฎเชฐเซเชฏเชพเชฆเชฟเชค เช›เซ‡. เช–เชพเชธ เช•เชฐเซ€เชจเซ‡ เช•เซเชฒเชฟเชจเชฟเช•เชฒ เช•เซ‡เชธเชฎเชพเช‚ เชฎเชพเชฐเซ‡ เชœเซ‹เชตเชพเชจเซเช‚ เชนเชคเซเช‚ "เชธเช‚เช–เซเชฏเชพ" เชฆเชฒเซ€เชฒเซ‹ $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_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 เชฎเชพเช‚ เช•เซ‹เชทเซเชŸเช•เซ‹เชจเซ‡ "เชธเซ‹เชœเซ‹" เชคเชฐเชซ เชฆเซ‹เชฐเซ€ เชœเชพเชฏ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชคเชพ เช˜เชฃเชพ เช“เชชเชฐเซ‡เชถเชจเชจเซ‡ เชงเซ€เชฎเซเช‚ เช•เชฐเซ‡ เช›เซ‡.
เช…เชฒเชฌเชคเซเชค, เช†เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชตเซเชฏเชตเชนเชพเชฐ เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡ เชธเชพเชฎเชฏเชฟเช• เชฎเชพเชฐเซเช— เชตเซ‡เช•เซเชฏเซเชฎ เชชเซ‚เชฐเซเชฃ เชธเชฟเชธเซเชŸเชฎ เช•เซ‡เชŸเชฒเซ‹เช— เช•เซ‹เชทเซเชŸเช•เซ‹ เช…เชจเซเชธเชพเชฐ.

เชธเชคเซเชฐ เชšเชฒเซ‹

เชšเชพเชฒเซ‹ เชงเชพเชฐเซ€เช เช•เซ‡ เชเช• SQL เช•เซเชตเซ‡เชฐเซ€ เชฎเชพเชŸเซ‡ เช…เช—เชพเช‰เชจเชพ เช•เซ‡เชธเชฎเชพเช‚เชฅเซ€ เชกเซ‡เชŸเชพ เชชเชฐ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เชฐเชตเซ€ เช–เซ‚เชฌ เชœเชŸเชฟเชฒ เช›เซ‡, เชชเชฐเช‚เชคเซ เชคเชฎเซ‡ เชคเซ‡เชจเซ‡ เช˜เชฃเซ€ เชตเชพเชฐ เช•เชฐเชตเชพ เชฎเชพเช‚เช—เซ‹ เช›เซ‹. เชเชŸเชฒเซ‡ เช•เซ‡, เช…เชฎเซ‡ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเช—เชค เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพ เชฎเชพเช‚เช—เซ€เช เช›เซ€เช DO เชฌเซเชฒเซ‹เช•, เชชเชฐเช‚เชคเซ เช…เชธเซเชฅเชพเชฏเซ€ เช•เซ‹เชทเซเชŸเช•เซ‹ เชฆเซเชตเชพเชฐเชพ เชกเซ‡เชŸเชพ เชŸเซเชฐเชพเชจเซเชธเชซเชฐเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเซ‹ เช–เซ‚เชฌ เช–เชฐเซเชšเชพเชณ เชนเชถเซ‡.

เช…เชฎเซ‡ เช…เชจเชพเชฎเซ€ เชฌเซเชฒเซ‹เช•เชฎเชพเช‚ เชœเชตเชพ เชฎเชพเชŸเซ‡ $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

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹