PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Cách kiểm tra SQL đặc biệt của tôi với các tham số trong cửa sổ truy vấn Postgres

Nhiều tùy chọn.

Cung cấp các tham số trong CTE để có "biến" trong SQL thuần túy :

WITH var(lastname) AS (SELECT 'Troy'::varchar(16))
SELECT *
FROM   users, var v
WHERE  lastname = v.lastname;

Điều này hoạt động cho bất kỳ truy vấn.
Kể từ CTE var giữ một hàng đơn an toàn khi nối nó bằng CROSS JOIN ở cuối mệnh đề FROM - trên thực tế, dạng rút gọn có gắn nó sau dấu phẩy có thể là tốt nhất vì cú pháp nối rõ ràng liên kết trước dấu phẩy. Bí danh bảng bổ sung v là tùy chọn để rút ngắn cú pháp hơn nữa.

HOẶC rẻ hơn mà không có CTE. BTW, tại sao lại varchar(16) ? Chỉ cần sử dụng text :

SELECT *
FROM   users
JOIN  (SELECT 'Troy'::text) var(lastname) USING (lastname)
WHERE  lastname = var.lastname;

Hoặc sử dụng bảng tạm thời đóng một vai trò tương tự cho tất cả truy vấn trong cùng một phiên. Bảng tạm thời sẽ chết khi kết thúc phiên.

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);
  • Giới thiệu về bảng tạm thời và autovacuum

Hoặc bạn có thể sử dụng DO các câu lệnh như @Houari được cung cấp hoặc tương tự được trình bày tại đây:

  • PostgreSQL lặp lại các chức năng bên ngoài. Điều đó có khả thi không?

Lưu ý rằng bạn không thể trả về các giá trị từ DO các câu lệnh. (Bạn có thể sử dụng RAISE ... mặc dù vậy.) Và bạn không thể sử dụng SELECT không có đích trong plpgsql - ngôn ngữ thủ tục mặc định trong DO tuyên bố. Thay thế SELECT với PERFORM để loại bỏ kết quả.

Hoặc bạn có thể sử dụng tùy chọn tùy chỉnh , mà bạn có thể đặt trong postgresql.conf được hiển thị trên toàn cầu .

Hoặc đặt trong phiên của bạn để hiển thị trong suốt thời gian của phiên và chỉ trong cùng một phiên :

SET my.lastname = 'Troy';

Tên biến phải bao gồm một dấu chấm. Bạn bị giới hạn ở text là kiểu dữ liệu theo cách này, nhưng bất kỳ kiểu dữ liệu nào cũng có thể được biểu diễn dưới dạng text ...

Bạn có thể sử dụng current_setting('my.lastname') dưới dạng biểu thức giá trị. Truyền nếu bạn cần. Ví dụ:current_setting('my.json_var')::json ...

Hoặc sử dụng SET LOCAL để hiệu lực chỉ kéo dài cho giao dịch hiện tại . Xem:

  • Chuyển id người dùng đến trình kích hoạt PostgreSQL

Hoặc bạn có thể sử dụng IMMUTABLE nhỏ chức năng toàn cầu các biến cố định mà chỉ người dùng có đặc quyền mới có thể thao tác. Xem:

  • Có cách nào để xác định một hằng số được đặt tên trong truy vấn PostgreSQL không?

Hoặc khi làm việc với psql dưới dạng ứng dụng khách, hãy sử dụng \set hoặc \gset các lệnh meta và thay thế biến.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để làm tròn số trung bình đến 2 chữ số thập phân trong PostgreSQL?

  2. Làm cách nào để chèn một bản ghi có thể cập nhật với cột JSON trong PostgreSQL bằng JOOQ?

  3. Thực hiện các giao dịch trong khi thực hiện một hàm postgreql

  4. Postgres kích hoạt sau khi chèn truy cập MỚI

  5. GROUP hoặc DISTINCT sau khi JOIN trả về các bản sao