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

Làm thế nào bạn có thể mở rộng một hàng PostgreSQL cô đọng thành các cột riêng biệt?

9.3 trở lên:truy vấn bên

Trong PostgreSQL 9.3 hoặc mới hơn, sử dụng truy vấn bên ngầm:

SELECT f.* FROM things t, some_function(t.thing_id) f;

Ưu tiên công thức này cho tất cả các truy vấn mới . Trên đây là công thức tiêu chuẩn .

Nó cũng hoạt động đúng với các chức năng RETURNS TABLE hoặc RETURNS SETOF RECORD cũng như các funcs có thông số ngoài RETURNS RECORD .

Nó viết tắt của:

SELECT f.*
FROM things t
CROSS JOIN LATERAL some_function(t.thing_id) f;

Trước 9.3:mở rộng ký tự đại diện (cẩn thận)

Các phiên bản trước, gây ra đánh giá nhiều lần đối với some_function , không không hoạt động nếu some_function trả về một tập hợp, không sử dụng tập hợp này :

SELECT (some_function(thing_id)).* FROM things;

Các phiên bản trước, tránh đánh giá nhiều lần some_function bằng cách sử dụng lớp thứ hai của hướng dẫn. Chỉ sử dụng điều này nếu bạn phải hỗ trợ các phiên bản PostgreSQL khá cũ.

SELECT (f).*
FROM (
  SELECT some_function(thing_id) f
  FROM things
) sub(f);

Bản trình diễn:

Thiết lập:

CREATE FUNCTION some_function(i IN integer, x OUT integer, y OUT text, z OUT text) RETURNS record LANGUAGE plpgsql AS $$
BEGIN
  RAISE NOTICE 'evaluated with %',i;
  x := i;
  y := i::text;
  z := 'dummy';
  RETURN;
END;
$$;

create table things(thing_id integer);
insert into things(thing_id) values (1),(2),(3);

chạy thử nghiệm:

demo=>     SELECT f.* FROM things t, some_function(t.thing_id) f;
NOTICE:  evaluated with 1
NOTICE:  evaluated with 2
NOTICE:  evaluated with 3
 x | y |   z   
---+---+-------
 1 | 1 | dummy
 2 | 2 | dummy
 3 | 3 | dummy
(3 rows)

demo=>     SELECT (some_function(thing_id)).* FROM things;
NOTICE:  evaluated with 1
NOTICE:  evaluated with 1
NOTICE:  evaluated with 1
NOTICE:  evaluated with 2
NOTICE:  evaluated with 2
NOTICE:  evaluated with 2
NOTICE:  evaluated with 3
NOTICE:  evaluated with 3
NOTICE:  evaluated with 3
 x | y |   z   
---+---+-------
 1 | 1 | dummy
 2 | 2 | dummy
 3 | 3 | dummy
(3 rows)

demo=>  SELECT (f).*
    FROM (
      SELECT some_function(thing_id) f
      FROM things
    ) sub(f);
NOTICE:  evaluated with 1
NOTICE:  evaluated with 2
NOTICE:  evaluated with 3
 x | y |   z   
---+---+-------
 1 | 1 | dummy
 2 | 2 | dummy
 3 | 3 | dummy
(3 rows)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sao lưu PostgreSQL bằng pg_dump và pg_dumpall

  2. Làm thế nào để tạo trường ARRAY với ràng buộc khóa ngoại trong SQLAlchemy?

  3. Làm cách nào để tạo kiểu cột tùy chỉnh với Typesafe Slick trong Scala?

  4. Khóa chính tổng hợp trong django

  5. PostgreSQL - Bảng trống