Bagaimana cara mendeklarasikan variabel untuk digunakan dalam kueri PostgreSQL 8.3?
Di MS SQL Server saya bisa melakukan ini:
DECLARE @myvar INT
SET @myvar = 5
SELECT *
FROM somewhere
WHERE something = @myvar
Bagaimana saya melakukan hal yang sama di PostgreSQL? Menurut variabel dokumentasi dinyatakan hanya sebagai "tipe nama;", tetapi ini memberi saya kesalahan sintaks:
myvar INTEGER;
Bisakah seseorang memberi saya contoh sintaks yang benar?
Jawaban:
Tidak ada fitur seperti itu di PostgreSQL. Anda dapat melakukannya hanya di pl / PgSQL (atau pl / * lainnya), tetapi tidak dalam SQL biasa.
Pengecualian adalah
WITH ()
kueri yang bisa berfungsi sebagai variabel, atau bahkantuple
variabel. Ini memungkinkan Anda untuk mengembalikan tabel nilai sementara.sumber
Saya mencapai tujuan yang sama dengan menggunakan
WITH
klausa , itu sama sekali tidak elegan tetapi dapat melakukan hal yang sama. Meskipun untuk contoh ini benar-benar berlebihan. Saya juga tidak terlalu merekomendasikan ini.sumber
\set
seperti yang disarankan dalam jawaban Shahriar Aghajani.JOIN myconstants ON true
dan kemudian tidak perlu melakukan sub-pilih.WITH
CTE lintas permintaan dalam transaksi.WITH constants AS (SELECT 5 AS var) SELECT * FROM somewhere CROSS JOIN constants WHERE someting=var;
. CROSS JOIN, menjadi dengan ekspresi tabel baris tunggal, secara virtual menduplikasi data untuk semua baris dalam tabel nyata, dan menyederhanakan ekspresi.Anda juga dapat mencoba ini di PLPGSQL:
Di atas membutuhkan Postgres 9.0 atau lebih tinggi.
sumber
Pengaturan Konfigurasi Dinamis
Anda dapat "menyalahgunakan" pengaturan konfigurasi dinamis untuk ini:
Pengaturan konfigurasi selalu merupakan nilai varchar, jadi Anda harus mengubahnya ke tipe data yang benar saat menggunakannya. Ini berfungsi dengan klien SQL mana pun sedangkan
\set
hanya bekerja dipsql
Di atas membutuhkan Postgres 9.2 atau yang lebih baru.
Untuk versi sebelumnya, variabel harus dideklarasikan
postgresql.conf
sebelum digunakan, sehingga agak membatasi kegunaannya. Sebenarnya bukan variabel sepenuhnya, tetapi konfigurasi "kelas" yang pada dasarnya adalah awalan. Tetapi begitu awalan didefinisikan, variabel apa pun dapat digunakan tanpa mengubahpostgresql.conf
sumber
set session my.vars.id = '1';
keset session my.user.id = '1';
akan menghasilkanERROR: syntax error at or near "user"
SET LOCAL ...
. Thesession
variabel akan berlaku selama Anda koneksi. Thelocal
dijangkau untuk transaksi.set session "my.user.id" = '1';
Thecurrent_setting('my.user.id')
panggilan bekerja seperti yang diharapkan.Itu tergantung pada klien Anda.
Namun, jika Anda menggunakan klien psql , maka Anda dapat menggunakan yang berikut ini:
Jika Anda menggunakan variabel teks, Anda perlu mengutip.
sumber
\set
harus huruf kecildb=> \set someid 8292 db=> SELECT * FROM sometable WHERE id = :someid;
Menggunakan Tabel Temp di luar pl / PgSQL
Di luar menggunakan pl / pgsql atau bahasa pl / * lainnya seperti yang disarankan, ini adalah satu-satunya kemungkinan lain yang dapat saya pikirkan.
sumber
Saya ingin mengusulkan perbaikan untuk jawaban DarioBarrionuevo @ , untuk membuatnya lebih sederhana memanfaatkan tabel sementara.
sumber
1
(mungkin jumlah baris) daripada isitmp_table
.Solusi ini didasarkan pada yang diusulkan oleh fei0x tetapi memiliki keuntungan bahwa tidak perlu bergabung dengan daftar nilai konstanta dalam kueri dan konstanta dapat dengan mudah dicantumkan pada awal kueri. Ini juga berfungsi dalam permintaan rekursif.
Pada dasarnya, setiap konstanta adalah tabel nilai tunggal yang dideklarasikan dalam klausa DENGAN yang kemudian dapat dipanggil di mana saja di bagian kueri yang tersisa.
Atau Anda dapat menggunakan
SELECT * FROM constant_name
bukannyaTABLE constant_name
yang mungkin tidak berlaku untuk bahasa query lain yang berbeda untuk postgresql.sumber
Berikut adalah contoh menggunakan pernyataan SIAPKAN . Anda masih tidak dapat menggunakan
?
, tetapi Anda dapat menggunakan$n
notasi:sumber
Benar, tidak ada cara yang jelas dan tidak ambigu untuk mendeklarasikan variabel nilai tunggal, yang dapat Anda lakukan adalah
kemudian, untuk mendapatkan akses ke nilai yang disimpan dalam konstruksi ini, Anda lakukan
sebagai contoh
sumber
Anda dapat menggunakan fitur khusus alat. Seperti untuk sintaks kepemilikan DBeaver sendiri:
sumber
Di DBeaver Anda bisa menggunakan parameter dalam kueri seperti yang Anda dapat dari kode, jadi ini akan berfungsi:
Ketika Anda menjalankan kueri, DBeaver akan meminta nilai untuk: myvar dan menjalankan kueri.
sumber