PostgreSQL AntipatternsαŸ– αž†αŸ’αž›αž„αž€αžΆαžαŸ‹αžŸαŸ†αžŽαž»αŸ† αž“αž·αž„αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαž‘αŸ… SQL

αž–αžΈαž–αŸαž›αž˜αž½αž™αž‘αŸ…αž–αŸαž›αž˜αž½αž™αž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸαžαŸ’αžšαžΌαžœαž€αžΆαžš αž†αŸ’αž›αž„αž€αžΆαžαŸ‹αžŸαŸ†αžŽαž»αŸ†αž“αŸƒαž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžš αž¬αžŸαžΌαž˜αŸ’αž”αžΈαžαŸ‚αž€αžΆαžšαž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαž‘αžΆαŸ†αž„αž˜αžΌαž›αž‘αŸ…αž“αžΉαž„αžŸαŸ†αžŽαžΎ "αž“αŸ…αž…αŸ’αžšαž€αž…αžΌαž›" αŸ” αž–αŸαž›αžαŸ’αž›αŸ‡αž˜αžΆαž“αžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž…αŸ†αž›αŸ‚αž€αž…αŸ†αž–αŸ„αŸ‡αž”αž‰αŸ’αž αžΆαž“αŸαŸ‡αŸ”
PostgreSQL AntipatternsαŸ– αž†αŸ’αž›αž„αž€αžΆαžαŸ‹αžŸαŸ†αžŽαž»αŸ† αž“αž·αž„αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαž‘αŸ… SQL
αž…αžΌαžšαž™αžΎαž„αž‘αŸ… "αž–αžΈαž—αžΆαž–αž•αŸ’αž‘αž»αž™αž‚αŸ’αž“αžΆ" αž αžΎαž™αž˜αžΎαž›αž–αžΈαžšαž”αŸ€αž”αž˜αž·αž“αž’αŸ’αžœαžΎαžœαžΆ αž αŸαžαž»αž’αŸ’αžœαžΈ αž“αž·αž„αžšαž”αŸ€αž”αžŠαŸ‚αž›αž’αŸ’αž“αž€αž’αžΆαž…αž’αŸ’αžœαžΎαžœαžΆαž”αžΆαž“αž”αŸ’αžšαžŸαžΎαžšαž‡αžΆαž„αž˜αž»αž“αŸ”

"αž€αžΆαžšαž”αž‰αŸ’αž…αžΌαž›" αžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹αž“αŸƒαžαž˜αŸ’αž›αŸƒαž“αŸ…αž€αŸ’αž“αž»αž„αžαž½αžŸαŸ†αžŽαžΎ

αž‡αžΆαž’αž˜αŸ’αž˜αžαžΆαžœαžΆαž˜αžΎαž›αž‘αŸ…αžŠαžΌαž…αž“αŸαŸ‡αŸ–

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

... αž¬αžŠαžΌαž…αž“αŸαŸ‡αŸ–

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

αž’αŸ†αž–αžΈαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž“αŸαŸ‡αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž“αž·αž™αžΆαž™αžŸαžšαžŸαŸαžšαž“αž·αž„ αžŸαžΌαž˜αŸ’αž”αžΈαžαŸ‚αž‚αžΌαžš αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαžΆαž“αŸ‹:

PostgreSQL AntipatternsαŸ– αž†αŸ’αž›αž„αž€αžΆαžαŸ‹αžŸαŸ†αžŽαž»αŸ† αž“αž·αž„αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαž‘αŸ… 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 αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž’αž„αŸ’αž‚αž…αž„αž…αžΆαŸ†αž”αž“αŸ’αžαŸ‚αž˜αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αžΆαž‚αž»αž™αž˜αŸ‰αž„αŸ‹ αž αžΎαž™αž…αŸ†αž“αž½αž“αž€αŸ†αžŽαžαŸ‹αžαŸ’αžšαžΆαž€αŸ’αž“αž»αž„αžŸαŸ†αžŽαž»αŸ†αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αžαŸ’αžšαžΉαž˜αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžαž€αŸ’αž€αžœαž·αž‡αŸ’αž‡αžΆαž’αžΆαž‡αžΈαžœαž€αž˜αŸ’αž˜ Wishlist αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ” αž‡αžΆαž–αž·αžŸαŸαžŸαž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž‚αŸ’αž›αžΈαž“αž·αž€ αž…αžΆαŸ†αž”αžΆαž…αŸ‹αžαŸ’αžšαžΌαžœαž–αž·αž“αž·αžαŸ’αž™ αž’αžΆαž‚αž»αž™αž˜αŸ‰αž„αŸ‹ "αž›αŸαž" αž’αŸ†αž‡αžΆαž„ $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 PostgreSQL αž˜αžΆαž“αž˜αž»αžαž„αžΆαžšαž–αŸαž‰αž›αŸαž‰αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αž”αŸ’αžšαž—αŸαž‘ json αŸ” αžŠαžΌαž…αŸ’αž“αŸαŸ‡ αž”αŸ’αžšαžŸαž·αž“αž”αžΎβ€‹αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšβ€‹αž”αž‰αŸ’αž…αžΌαž›β€‹αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€β€‹αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“αž€αŸ†αžŽαžαŸ‹β€‹αž€αŸ’αž“αž»αž„β€‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžšαž»αž€αžšαž€αžαžΆαž˜αž’αŸŠαžΈαž“αž’αžΊαžŽαž·αž αž’αŸ’αž“αž€αž’αžΆαž…β€‹αž“αŸ…αž‘αžΈαž“αŸ„αŸ‡ αž αžΎαž™β€‹αž”αž„αŸ’αž€αžΎαžβ€‹αž‘αž˜αŸ’αžšαž„αŸ‹ αžœαžαŸ’αžαž» json αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŸαŸ†αžŽαž½αžš SQL:

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

αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αŸ†αžŽαŸ‚αž˜αž»αž“ αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžšαžŠαžΌαž…αž‚αŸ’αž“αžΆαž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαžŸαž˜αŸ’αžšαžΆαž”αŸ‹ αž“αžΈαž˜αž½αž™αŸ— (hstore)αž”αŸ‰αž»αž“αŸ’αžαŸ‚ "αž”αžαŸ‹" αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαž‚αŸαž…αž…αŸαž‰αž–αžΈαžœαžαŸ’αžαž»αžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αž“αŸ…αž€αŸ’αž“αž»αž„ hstore αž’αžΆαž…αž”αžŽαŸ’αžαžΆαž›αž±αŸ’αž™αž˜αžΆαž“αž”αž‰αŸ’αž αžΆαŸ”

json_populate_recordset

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αžŠαžΉαž„αž‡αžΆαž˜αž»αž“αžαžΆαž‘αž·αž“αŸ’αž“αž“αŸαž™αž–αžΈ "input" json array αž“αžΉαž„αž‘αŸ…αž”αŸ†αž–αŸαž‰αž€αŸ’αž“αž»αž„αžαžΆαžšαžΆαž„αž˜αž½αž™αž…αŸ†αž“αž½αž“ αž’αŸ’αž“αž€αž’αžΆαž…αžŸαž“αŸ’αžŸαŸ†αž”αžΆαž“αž…αŸ’αžšαžΎαž“αž€αŸ’αž“αž»αž„ "dereferencing" fields αž αžΎαž™αž”αž‰αŸ’αž‡αžΌαž“αž‘αŸ…αž€αžΆαž“αŸ‹αž”αŸ’αžšαž—αŸαž‘αžŠαŸ‚αž›αž…αž„αŸ‹αž”αžΆαž“αžŠαŸ„αž™αž”αŸ’αžšαžΎαž˜αž»αžαž„αžΆαžš 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 αž“αž·αž„αž”αž“αŸ’αžαž™αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž‡αžΆαž…αŸ’αžšαžΎαž“αžŠαŸ‚αž›αž”αŸ’αžšαžΎαžœαžΆαŸ”
αž‡αžΆαž€αžΆαžšαž–αž·αžαžŽαžΆαžŸαŸ‹αž“αŸαŸ‡αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαž™αž»αž‘αŸ’αž’αž‡αžΆαž˜αž½αž™ αž†αŸ’αž›αž„αž€αžΆαžαŸ‹αžαžΆαž˜αž€αžΆαž›αž€αŸ†αžŽαžαŸ‹ VACUUM αž–αŸαž‰ αž“αŸαŸ‡αž”αžΎαž™αŸ„αž„αžαžΆαž˜αžαžΆαžšαžΆαž„αž“αŸƒαž€αžΆαžαžΆαž‘αž»αž€αž”αŸ’αžšαž–αŸαž“αŸ’αž’αŸ”

αž’αžαŸαžšαžŸαž˜αŸαž™

αž§αž”αž˜αžΆαžαžΆαž€αžΆαžšαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αž–αžΈαž€αžšαžŽαžΈαž˜αž»αž“αž‚αžΊαžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŸαŸ†αžŽαž½αžš SQL αžαŸ‚αž˜αž½αž™ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž’αŸ’αž“αž€αž…αž„αŸ‹αž’αŸ’αžœαžΎαžœαžΆαž‰αžΉαž€αž‰αžΆαž”αŸ‹αŸ” αž“αŸ„αŸ‡αž‚αžΊαž™αžΎαž„αž…αž„αŸ‹αž”αŸ’αžšαžΎαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αžΈαžαž·αžœαž·αž’αžΈαž“αŸ…αž€αŸ’αž“αž»αž„ αž’αŸ’αžœαžΎαž”αŸ’αž›αž»αž€αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž€αžΆαžšαž”αŸ’αžšαžΎαž€αžΆαžšαž•αŸ’αž‘αŸαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αžαžΆαž˜αžšαž™αŸˆαžαžΆαžšαžΆαž„αž”αžŽαŸ’αžαŸ„αŸ‡αž’αžΆαžŸαž“αŸ’αž“αž“αžΉαž„αž˜αžΆαž“αžαž˜αŸ’αž›αŸƒαžαŸ’αž›αŸƒαž–αŸαž€αŸ”

αž™αžΎαž„αž€αŸαž˜αž·αž“αž’αžΆαž…αž”αŸ’αžšαžΎ $n-parameters αžŠαžΎαž˜αŸ’αž”αžΈαž”αž‰αŸ’αž‡αžΌαž“αž‘αŸ…αž€αžΆαž“αŸ‹αž”αŸ’αž›αž»αž€αž’αž“αžΆαž˜αž·αž€αžŠαŸ‚αžšαŸ” αž’αžαŸαžšαžŸαž˜αŸαž™ αž“αž·αž„αž˜αž»αžαž„αžΆαžšαž“αžΉαž„αž‡αž½αž™αž™αžΎαž„αž…αŸαž‰αž–αžΈαžŸαŸ’αžαžΆαž“αž—αžΆαž–αŸ” αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“.

αž˜αž»αž“αž–αŸαž›αž€αŸ†αžŽαŸ‚ 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

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹