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
t1tí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.
COALESCEmặc định thành0choNULL. - Tạo mảng đệm cho sự khác biệt về độ dài với
array_fill(). - Nối nó vào
arrvớ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 ở đó.