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;

เด…เดคเต†, เด’เดฐเต เด…เดฑเต‡เดฏเตโ€Œเด•เตเด•เตเดณเตเดณเดฟเดฒเต† "เดธเด™เตเด•เต€เตผเดฃเตเดฃเดฎเดพเดฏ" เดฎเต‚เดฒเตเดฏเด™เตเด™เดณเตเดŸเต† เด•เดพเดฐเตเดฏเดคเตเดคเดฟเตฝ, เด…เดต เด‰เดฆเตเดงเดฐเดฃเดฟเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดซเตเดฐเต†เดฏเดฟเด‚ เดšเต†เดฏเตเดฏเต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต.
เดˆ เดฐเต€เดคเดฟเดฏเดฟเตฝ เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด’เดฐเต เด…เดจเดฟเดฏเดจเตเดคเตเดฐเดฟเดคเดฎเดพเดฏ เดซเต€เตฝเดกเตเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดคเดฟเดฐเดžเตเดžเต†เดŸเตเดชเตเดชเต "เดตเดฟเดชเตเดฒเต€เด•เดฐเดฟเด•เตเด•เดพเตป" เด•เดดเดฟเดฏเตเดฎเต†เดจเตเดจเต เดตเตเดฏเด•เตเดคเดฎเดพเดฃเต.

unnest, unnest,โ€ฆ

เด•เดพเดฒเดพเด•เดพเดฒเด™เตเด™เดณเดฟเตฝ เดžเดพเตป เดธเต‚เดšเดฟเดชเตเดชเดฟเดšเตเดš "เดจเดฟเดฐเด•เดณเตเดŸเต† เดจเดฟเดฐเด•เตพ" เดŽเดจเตเดจเดคเดฟเดจเตเดชเด•เดฐเด‚ เด•เดŸเดจเตเดจเตเดชเต‹เด•เดพเดจเตเดณเตเดณ เด“เดชเตเดทเดจเตเด•เตพ เด‰เดฃเตเดŸเต. เด…เดตเดธเดพเดจ เดฒเต‡เด–เดจเดคเตเดคเดฟเตฝ:

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 เดฎเตเดคเตฝ, เดชเต‹เดธเตเดฑเตเดฑเตโ€Œเด—เตเดฐเต†เดŽเดธเตโ€Œเด•เตเดฏเตเดŽเดฒเตเดฒเดฟเดจเต json เดคเดฐเดคเตเดคเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เดชเต‚เตผเดฃเตเดฃเดฎเดพเดฏ เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เดณเตเดฃเตเดŸเต. เด…เดคเดฟเดจเดพเตฝ, เดจเดฟเด™เตเด™เดณเตเดŸเต† เด‡เตปเดชเตเดŸเตเดŸเต เดชเดพเดฐเดพเดฎเต€เดฑเตเดฑเดฑเตเด•เตพ เดฌเตเดฐเต—เดธเดฑเดฟเตฝ เดจเดฟเตผเดตเดšเดฟเดšเตเดšเดฟเดŸเตเดŸเตเดฃเตเดŸเต†เด™เตเด•เดฟเตฝ, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด…เดตเดฟเดŸเต†เดคเตเดคเดจเตเดจเต† เดฐเต‚เดชเดชเตเดชเต†เดŸเตเดคเตเดคเดพเด‚ SQL เด…เดจเตเดตเต‡เดทเดฃเดคเตเดคเดฟเดจเตเดณเตเดณ json เด’เดฌเตเดœเด•เตเดฑเตเดฑเต:

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-เดฒเต† เดชเดŸเตเดŸเดฟเด•เด•เดณเตเดŸเต† "เดตเต€เด•เตเด•เดคเตเดคเดฟเดฒเต‡เด•เตเด•เต" เดจเดฏเดฟเด•เตเด•เตเดจเตเดจเต เด…เดต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจ เดชเดฒ เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เดณเตเด‚ เดฎเดจเตเดฆเด—เดคเดฟเดฏเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเต.
เดคเต€เตผเดšเตเดšเดฏเดพเดฏเตเด‚, เด‡เดคเต เดจเต‡เดฐเดฟเดŸเดพเตป เด•เดดเดฟเดฏเตเด‚ เดชเต€เดฐเดฟเดฏเต‹เดกเดฟเด•เต เดชเดพเดธเต เดตเดพเด•เตเดตเด‚ เดซเตเตพ เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เดพเดฑเตเดฑเดฒเต‹เด—เต เดชเดŸเตเดŸเดฟเด•เด•เตพ เด…เดจเตเดธเดฐเดฟเดšเตเดšเต.

เดธเต†เดทเตป เดตเต‡เดฐเดฟเดฏเดฌเดฟเดณเตเด•เตพ

เด’เดฐเต SQL เดšเต‹เดฆเตเดฏเดคเตเดคเดฟเดจเต เดฎเตเดฎเตเดชเดคเตเดคเต† เด•เต‡เดธเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดกเดพเดฑเตเดฑเดฏเตเดŸเต† เดชเตเดฐเต‹เดธเดธเตเดธเดฟเด‚เด—เต เดตเดณเดฐเต† เดธเด™เตเด•เต€เตผเดฃเตเดฃเดฎเดพเดฃเต†เดจเตเดจเต เด•เดฐเตเดคเตเด•, เดŽเดจเตเดจเดพเตฝ เดจเดฟเด™เตเด™เตพ เด‡เดคเต เดชเดฒเดชเตเดชเต‹เดดเตเด‚ เดšเต†เดฏเตเดฏเดพเตป เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจเต. เด…เดคเดพเดฏเดคเต, เดจเดŸเดชเดŸเดฟเด•เตเดฐเดฎเดชเดฐเดฎเดพเดฏ เดชเตเดฐเต‹เดธเดธเตเดธเดฟเด‚เด—เต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเตป เดžเด™เตเด™เตพ เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจเต เดคเดŸเดฏเตเด•, เดŽเดจเตเดจเดพเตฝ เดคเดพเตฝเด•เตเด•เดพเดฒเดฟเด• เดŸเต‡เดฌเดฟเดณเตเด•เตพ เดตเดดเดฟเดฏเตเดณเตเดณ เดกเดพเดฑเตเดฑ เด•เตˆเดฎเดพเดฑเตเดฑเด‚ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเต เดตเดณเดฐเต† เดšเต†เดฒเดตเต‡เดฑเดฟเดฏเดคเดพเดฏเดฟเดฐเดฟเด•เตเด•เตเด‚.

เด’เดฐเต เด…เดœเตเดžเดพเดค เดฌเตเดฒเต‹เด•เตเด•เดฟเดฒเต‡เด•เตเด•เต เด•เดŸเด•เตเด•เดพเตป $n-เดชเดพเดฐเดพเดฎเต€เดฑเตเดฑเดฑเตเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเดจเตเด‚ เดžเด™เตเด™เตพเด•เตเด•เต เด•เดดเดฟเดฏเดฟเดฒเตเดฒ. เดธเต†เดทเตป เดตเต‡เดฐเดฟเดฏเดฌเดฟเดณเตเด•เดณเตเด‚ เดซเด‚เด—เตโ€Œเดทเดจเตเด‚ เดธเดพเดนเดšเดฐเตเดฏเดคเตเดคเดฟเตฝ เดจเดฟเดจเตเดจเต เดชเตเดฑเดคเตเดคเตเด•เดŸเด•เตเด•เดพเตป เดžเด™เตเด™เดณเต† เดธเดนเดพเดฏเดฟเด•เตเด•เตเด‚. เดจเดฟเดฒเดตเดฟเดฒเต†_เด•เตเดฐเดฎเต€เด•เดฐเดฃเด‚.

เดชเดคเดฟเดชเตเดชเต 9.2-เดจเต เดฎเตเดฎเตเดชเต, เดจเดฟเด™เตเด™เตพ เดฎเตเตปเด•เต‚เดŸเตเดŸเดฟ เด•เต‹เตบเดซเดฟเด—เตผ เดšเต†เดฏเตเดฏเต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต เดชเตเดฐเดคเตเดฏเต‡เด• เดจเต†เดฏเดฟเด‚เดธเตเดชเต‡เดธเต custom_variable_classes "เด…เดตเดฐเตเดŸเต†" เดธเต†เดทเตป เดตเต‡เดฐเดฟเดฏเดฌเดฟเดณเตเด•เตพเด•เตเด•เดพเดฏเดฟ. เดจเดฟเดฒเดตเดฟเดฒเต† เดชเดคเดฟเดชเตเดชเตเด•เดณเดฟเตฝ, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด‡เดคเตเดชเต‹เดฒเตŠเดจเตเดจเต เดŽเดดเตเดคเดพเด‚:

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

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•