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!