PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Bagaimana cara menguji SQL ad-hoc saya dengan parameter di jendela kueri Postgres

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dapatkan pohon orang tua + anak dengan pg-promise

  2. Tanggal PostgreSQL() dengan zona waktu

  3. Bagaimana cara membulatkan rata-rata menjadi 2 tempat desimal di PostgreSQL?

  4. Penyortiran alami yang mendukung angka besar

  5. Bagaimana make_timestamptz() Bekerja di PostgreSQL