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

Tương đương với univot () trong PostgreSQL

Tạo một bảng mẫu:

CREATE TEMP TABLE foo (id int, a text, b text, c text);
INSERT INTO foo VALUES (1, 'ant', 'cat', 'chimp'), (2, 'grape', 'mint', 'basil');

Bạn có thể 'bỏ chia' hoặc 'bỏ bảng' bằng UNION ALL:

SELECT id,
       'a' AS colname,
       a AS thing
FROM foo
UNION ALL
SELECT id,
       'b' AS colname, 
       b AS thing
FROM foo
UNION ALL
SELECT id, 
       'c' AS colname,
       c AS thing
FROM foo
ORDER BY id;

Thao tác này chạy 3 truy vấn con khác nhau trên foo , một cho mỗi cột mà chúng tôi muốn bỏ chia và trả về, trong một bảng, mọi bản ghi từ mỗi truy vấn con.

Nhưng điều đó sẽ quét bảng N lần, trong đó N là số cột bạn muốn bỏ chia. Điều này không hiệu quả và là một vấn đề lớn, chẳng hạn như khi bạn đang làm việc với một bảng rất lớn cần nhiều thời gian để quét.

Thay vào đó, hãy sử dụng:

SELECT id,
       unnest(array['a', 'b', 'c']) AS colname,
       unnest(array[a, b, c]) AS thing
FROM foo
ORDER BY id;

Điều này dễ viết hơn và nó sẽ chỉ quét bảng một lần.

array[a, b, c] trả về một đối tượng mảng, với các giá trị a, b và c là các phần tử của nó. unnest(array[a, b, c]) ngắt kết quả thành một hàng cho mỗi phần tử của mảng.

Hy vọng điều đó sẽ hữu ích!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hàm SUM () trong PostgreSQL

  2. Các tình huống thất bại PostgreSQL phổ biến nhất

  3. Khớp cụm từ kết thúc bằng tiền tố với tìm kiếm toàn văn

  4. PostgreSQL:KHÔNG VÀO so với EXCEPT sự khác biệt về hiệu suất (đã chỉnh sửa # 2)

  5. Tạo ràng buộc duy nhất với cột rỗng