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

Mảng đệm có độ dài từ NULL đến tối đa cho hàm tổng hợp tùy chỉnh

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ành 0 cho NULL .
  • 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 ở đó.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Biến ràng buộc cho tên cột trong PHP cho truy vấn Postgresql

  2. Tại sao '2'> '10'?

  3. PostgreSQL - Cách loại bỏ các giá trị lặp lại

  4. Postgresql, cập nhật nếu hàng có một số giá trị duy nhất tồn tại, nếu không thì chèn

  5. Có thể cung cấp các tham số cho tên bảng hoặc cột trong Câu lệnh chuẩn bị hoặc QueryRunner.update () không?