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),...

เจฌเฉ‡เจจเจคเฉ€ เจฆเฉ‡ "เจฎเฉเฉœ-เจ—เจฒเฉ‚เจ‡เฉฐเจ—" เจฆเฉ‡ เจจเจพเจฒ เจ‰เฉฑเจชเจฐ เจฆเฉฑเจธเฉ€เจ†เจ‚ เจธเจฎเฉฑเจธเจฟเจ†เจตเจพเจ‚ เจคเฉ‹เจ‚ เจ‡เจฒเจพเจตเจพ, เจ‡เจน เจธเจพเจจเฉ‚เฉฐ เจตเฉ€ เจฒเฉˆ เจธเจ•เจฆเจพ เจนเฉˆ เจธเจฎเจ เจคเฉ‹ เจฌเจพเจนเจฐ เจ…เจคเฉ‡ เจธเจฐเจตเจฐ เจ•เจฐเฉˆเจธเจผ. เจ•เจพเจฐเจจ เจธเจงเจพเจฐเจจ เจนเฉˆ - 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 เจตเจฟเฉฑเจš เจ—เฉเฉฐเจเจฒเจฆเจพเจฐ เจตเจธเจคเฉ‚เจ†เจ‚ เจคเฉ‹เจ‚ เจฌเจšเจฃ เจฆเฉ‡ เจจเจพเจฒ เจธเจนเฉ€ "เจซเฉ‹เจฒเจกเจฟเฉฐเจ—" เจธเจฎเฉฑเจธเจฟเจ†เจตเจพเจ‚ เจชเฉˆเจฆเจพ เจ•เจฐ เจธเจ•เจฆเฉ€ เจนเฉˆเฅค

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 เจคเฉ‹เจ‚ เจชเจนเจฟเจฒเจพเจ‚, เจคเฉเจนเจพเจจเฉ‚เฉฐ เจชเฉเจฐเฉ€-เจ•เจจเจซเจฟเจ—เจฐ เจ•เจฐเจจเจพ เจชเฉˆเจ‚เจฆเจพ เจธเฉ€ เจตเจฟเจธเจผเฉ‡เจธเจผ เจจเจพเจฎ เจธเจฅเจพเจจ 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

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹