Sử dụng hàm tổng hợp tùy chỉnh array_agg_mult()
như được định nghĩa trong câu trả lời có liên quan này:
Kết quả mong đợi của bạn là không thể:
{{1},NULL,{abc}}
Sẽ phải là:
{{1},{NULL},{abc}}
Chữ hoa đơn giản với 0 hoặc 1 phần tử mảng
Đối với trường hợp đơn giản là chỉ thay thế mảng trống:Bạn có thể đạt được điều đó với:
WITH t(arr) AS (
VALUES
('{1}'::text[])
,('{}')
,('{abc}')
)
SELECT array_agg_mult(ARRAY[CASE WHEN arr = '{}' THEN '{NULL}' ELSE arr END])
FROM t;
Phần đệm động cho n phần tử
Sử dụng array_fill()
để đệm mảng có NULL phần tử có độ dài tối đa:
SELECT array_agg_mult(ARRAY[
arr || array_fill(NULL::text
, ARRAY[max_elem - COALESCE(array_length(arr, 1), 0)])
]) AS result
FROM t, (SELECT max(array_length(arr, 1)) AS max_elem FROM t) t1;
Vẫn chỉ hoạt động cho 1 chiều mảng cơ bản.
Giải thích
- Truy vấn con
t1
tính độ dài tối đa của mảng 1 chiều cơ bản. -
COALESCE(array_length(arr, 1), 0)
tính độ dài của mảng trong hàng này.
COALESCE
mặc định thành0
choNULL
. - Tạo mảng đệm cho sự khác biệt về độ dài với
array_fill()
. - Nối nó vào
arr
với||
- Tổng hợp như trên với
array_agg_mult()
.
SQL Fiddle.
thể hiện tất cả .
Đầu ra trong SQL Fiddle bị sai lệch, vì vậy tôi chuyển kết quả thành văn bản ở đó.