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 là 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.