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

Lưu trữ truy vấn chung dưới dạng cột?

Có cách nào để lưu trữ lựa chọn con đó dưới dạng cột giả trong bảng không?

VIEW như đã được khuyên là một giải pháp hoàn toàn hợp lệ. Tiếp tục.

Nhưng có một cách khác phù hợp hơn với câu hỏi của bạn. Bạn có thể viết một hàm nhận loại bảng làm tham số để mô phỏng một "trường được tính toán" hoặc "cột được tạo" .

Hãy xem xét trường hợp thử nghiệm này, bắt nguồn từ mô tả của bạn:

CREATE TABLE tbl_a (a_id int, col1 int, col2 int);
INSERT INTO tbl_a VALUES (1,1,1), (2,2,2), (3,3,3), (4,4,4);

CREATE TABLE tbl_b (b_id int, a_id int, colx int);
INSERT INTO tbl_b VALUES
  (1,1,5),  (2,1,5),  (3,1,1)
, (4,2,8),  (5,2,8),  (6,2,6)
, (7,3,11), (8,3,11), (9,3,11);

Tạo hàm mô phỏng col3 :

CREATE FUNCTION col3(tbl_a)
  RETURNS int8
  LANGUAGE sql STABLE AS
$func$
SELECT sum(colx)
FROM   tbl_b b
WHERE  b.a_id = $1.a_id
$func$;

Bây giờ bạn có thể truy vấn:

SELECT a_id, col1, col2, tbl_a.col3
FROM   tbl_a;

Hoặc thậm chí:

SELECT *, a.col3 FROM tbl_a a;

Lưu ý cách tôi đã viết tbl_a.col3 / a.col3 , không chỉ col3 . Đây là điều cần thiết .

Không giống như "cột ảo" trong Oracle, nó không được tự động đưa vào SELECT * FROM tbl_a . Bạn có thể sử dụng VIEW cho điều đó.

Tại sao điều này hoạt động?

Cách phổ biến để tham chiếu cột trong bảng là sử dụng ký hiệu thuộc tính :

SELECT tbl_a.col1 FROM tbl_a;

Cách phổ biến để gọi một hàm là với ký hiệu hàm :

SELECT col3(tbl_a);

Nói chung, tốt nhất bạn nên tuân theo những cách chuẩn tắc này , phù hợp với tiêu chuẩn SQL.

Nhưng Postgres cũng cho phép ký hiệu thuộc tính. Những điều này cũng hoạt động:

SELECT col1(tbl_a) FROM tbl_a;
SELECT tbl_a.col3;

Thông tin thêm về điều đó trong sách hướng dẫn.
Bạn có thể thấy bây giờ, điều này sẽ đi đến đâu. Cái này trông như bạn muốn thêm một cột bổ sung của bảng tbl_a while col3() thực sự là một hàm nhận hàng hiện tại của tbl_a (hoặc bí danh của nó) làm đối số loại hàng và tính giá trị.

SELECT *, a.col3
FROM   tbl_a AS a;

Nếu có một cột thực tế col3 nó được ưu tiên và hệ thống không tìm kiếm một hàm của tên đó lấy hàng tbl_a dưới dạng tham số.

"Vẻ đẹp" của nó:bạn có thể thêm hoặc bớt các cột từ tbl_a và truy vấn cuối cùng sẽ tự động trả về tất cả các cột hiện tại, trong đó một chế độ xem sẽ chỉ trả về các cột như vậy đã tồn tại tại thời điểm tạo (liên kết sớm so với liên kết muộn của * ).
Tất nhiên, bạn phải bỏ chức năng phụ thuộc trước khi bạn có thể bỏ bảng ngay bây giờ. Và bạn phải cẩn thận để không làm mất hiệu lực của hàm khi thực hiện các thay đổi đối với bảng.

Tôi vẫn sẽ không sử dụng nó. Nó quá ngạc nhiên đối với độc giả ngây thơ.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Khi nào thì chọn khóa và mở khóa cập nhật?

  2. Làm thế nào để hiển thị số hàng trong truy vấn PostgreSQL?

  3. Làm cách nào để so sánh hàng hiện tại với hàng tiếp theo và hàng trước đó trong PostgreSQL?

  4. Làm thế nào để làm việc với PGpoint cho Định vị địa lý bằng PostgreSQL?

  5. Oracle chuyển sang PostgreSQL:Lý do nên di chuyển