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

Làm thế nào để thực hiện tổng hợp giống nhau trên mọi cột mà không cần liệt kê các cột?

Bạn cần SQL động cho điều đó, có nghĩa là bạn phải tạo một hàm hoặc chạy một DO yêu cầu. Vì bạn không thể trả về các giá trị trực tiếp từ giá trị sau, một hàm plpgsql nó là:

CREATE OR REPLACE function f_count_all(_tbl text
                           , OUT columns text[], OUT counts bigint[])
  RETURNS record LANGUAGE plpgsql AS
$func$
BEGIN

EXECUTE (
    SELECT 'SELECT
     ARRAY[' || string_agg('''' || quote_ident(attname) || '''', ', ') || '], 
     ARRAY[' || string_agg('count(' || quote_ident(attname) || ')', ', ') || ']
    FROM ' || _tbl
    FROM   pg_attribute
    WHERE  attrelid = _tbl::regclass
    AND    attnum  >= 1           -- exclude tableoid & friends (neg. attnum)
    AND    attisdropped is FALSE  -- exclude deleted columns
    GROUP  BY attrelid
    )
INTO columns, counts;

END
$func$;

Gọi:

SELECT * FROM f_count_all('myschema.mytable');

Lợi nhuận:

Các cột
columns       | counts
--------------+--------
{c1, c2, c3,} | {17 1,0}

Giải thích thêm và các liên kết về SQL động và EXECUTE trong câu hỏi liên quan này - hoặc một vài câu hỏi khác ở đây trên SO, hãy thử serach này.

Rất giống với câu hỏi này:
postgresql - số lượng (không có giá trị rỗng) của mỗi cột trong bảng

Bạn thậm chí có thể thử và trả về một loại bản ghi đa hình để nhận động các cột đơn lẻ, nhưng điều đó khá phức tạp và nâng cao. Có lẽ là quá nhiều nỗ lực cho trường hợp của bạn. Thêm trong câu trả lời liên quan này.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chạy tệp hàng loạt bằng lệnh psql mà không cần mật khẩu

  2. Rails Migration:Bigint trên PostgreSQL dường như không thành công?

  3. Cách thay đổi mã hóa bộ sưu tập cơ sở dữ liệu mẫu

  4. psql:FATAL:Xác thực ngang hàng không thành công cho nhà phát triển người dùng

  5. SAO CHÉP với tên tệp động