Berbagai pilihan.
Berikan parameter dalam CTE untuk memiliki "variabel" di SQL murni :
WITH var(lastname) AS (SELECT 'Troy'::varchar(16))
SELECT *
FROM users, var v
WHERE lastname = v.lastname;
Ini berfungsi untuk apa saja kueri.
Sejak var
CTE memegang satu baris aman untuk menambahkannya dengan CROSS JOIN
di akhir klausa FROM - sebenarnya bentuk pendek dengan menambahkannya setelah koma mungkin yang terbaik karena sintaks gabungan eksplisit mengikat sebelum koma. Alias tabel tambahan v
adalah opsional untuk lebih mempersingkat sintaks.
ATAU lebih murah tanpa CTE. BTW, kenapa varchar(16)
? Cukup gunakan text
:
SELECT *
FROM users
JOIN (SELECT 'Troy'::text) var(lastname) USING (lastname)
WHERE lastname = var.lastname;
Atau gunakan tabel sementara untuk memainkan peran yang sama untuk semua pertanyaan dalam sesi yang sama. Tabel sementara mati dengan akhir sesi.
CREATE TEMP TABLE var AS
SELECT text 'Troy' AS lastname;
ANALYZE var; -- temp tables are not covered by autovacuum
SELECT * FROM users JOIN var USING (lastname);
- Tentang tabel sementara dan
autovacuum
Atau anda dapat menggunakan DO
pernyataan seperti yang diberikan @Houari atau seperti yang ditunjukkan di sini:
- PostgreSQL mengulang fungsi di luar. Apakah itu mungkin?
Perhatikan bahwa Anda tidak dapat mengembalikan nilai dari DO
pernyataan. (Anda dapat menggunakan RAISE ...
meskipun.) Dan Anda tidak dapat menggunakan SELECT
tanpa target di plpgsql - bahasa prosedural default dalam DO
penyataan. Ganti SELECT
dengan PERFORM
untuk membuang hasil.
Atau Anda dapat menggunakan opsi yang disesuaikan , yang dapat Anda atur di postgresql.conf
agar terlihat secara global .
Atau setel di sesi Anda agar terlihat selama sesi dan hanya di sesi yang sama :
SET my.lastname = 'Troy';
Nama variabel harus menyertakan titik. Anda terbatas pada text
sebagai tipe data dengan cara ini, tetapi tipe data apa pun dapat direpresentasikan sebagai text
...
Anda dapat menggunakan current_setting('my.lastname')
sebagai ekspresi nilai. Cast jika Anda membutuhkan. Misalnya:current_setting('my.json_var')::json
...
Atau gunakan SET LOCAL
agar efeknya hanya bertahan untuk transaksi saat ini . Lihat:
- Meneruskan id pengguna ke pemicu PostgreSQL
Atau anda dapat menggunakan IMMUTABLE
tiny kecil fungsi sebagai global variabel bertahan yang hanya dapat dimanipulasi oleh pengguna istimewa. Lihat:
- Apakah ada cara untuk mendefinisikan konstanta bernama dalam kueri PostgreSQL?
Atau ketika bekerja dengan psql sebagai klien, gunakan \set
atau \gset
meta-perintah dan substitusi variabel.