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

Hàm PLpgSQL để tìm các cột chỉ có giá trị NULL trong một bảng nhất định

Bạn có thể truy vấn bảng danh mục pg_attribute để lấy danh sách các cột không được xác định NOT NULL và do đó có thể giữ NULL giá trị:

SELECT quote_ident(attname) AS column_can_be_null
FROM   pg_attribute
WHERE  attrelid = 'tbl'::regclass -- valid, visible table name 
AND    attnum >= 1                -- exclude tableoid & friends
AND    NOT attisdropped           -- exclude dropped columns
AND    NOT attnotnull             -- exclude columns defined NOT NULL!
ORDER  BY attnum;

Ở đâu tbl là tên bảng (tùy chọn đủ điều kiện giản đồ) của bạn.

Không cho biết có bất kỳ giá trị NULL thực tế nào trong cột. Bạn sẽ phải kiểm tra từng cột. Như thế này:

Tự động hóa hoàn toàn với chức năng plpgsql

CREATE OR REPLACE FUNCTION f_all_null_columns_of_tbl(_tbl regclass)
  RETURNS SETOF text AS
$func$
DECLARE
   _row_ct  bigint;        -- count rows in table $1
   _sql     text;          -- SQL string to test for NULL values
   _cols    text[];        -- array of candidate column names
   _nulls   bool[];        -- array of test results
BEGIN

EXECUTE 'SELECT count(*) FROM ' || _tbl
INTO _row_ct;

IF _row_ct = 0 THEN
   RAISE EXCEPTION 'Table % has no rows!', _tbl;  -- pointless for empty table
ELSE
   RAISE NOTICE '% rows in table %.', _row_ct, _tbl; 
END IF;

SELECT INTO _sql, _cols
      'SELECT ARRAY[' || string_agg('bool_and(' || col || ' IS NULL)', ', ')
       || '] FROM ' || _tbl
    , array_agg(col)
FROM  (
   SELECT quote_ident(attname) AS col
   FROM   pg_attribute
   WHERE  attrelid = _tbl            -- valid, visible table name 
   AND    attnum >= 1                -- exclude tableoid & friends
   AND    NOT attisdropped           -- exclude dropped columns
   AND    NOT attnotnull             -- exclude columns defined NOT NULL!
   ORDER  BY attnum
   ) sub;

EXECUTE _sql INTO _nulls;

FOR i IN 1 .. array_upper(_cols, 1)
LOOP
   IF _nulls[i] THEN                 -- column is NULL in all rows
      RETURN NEXT _cols[i];
   END IF;
END LOOP;

RETURN;
END
$func$ LANGUAGE plpgsql;

Gọi:

SELECT f_all_null_columns_of_tbl('my_schema.my_table');

Đã thử nghiệm với Postgres 9.1 và 9.3.
Điều này sử dụng một số tính năng plpgsql nâng cao.

SQL Fiddle.

Câu trả lời liên quan xây dựng mã SQL và thực thi nó, với cú pháp hiện đại:

Giới thiệu về việc duyệt qua một bản ghi:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. psql:FATAL:role postgres không tồn tại (với tùy chọn -h localhost)

  2. Knex kết nối với Heroku Postgres bị lỗi?

  3. 'lỗi cú pháp ở cuối đầu vào' - trong khi cố gắng khởi chạy thủ tục được lưu trữ từ DB

  4. Tiện ích mở rộng ngôn ngữ JavaScript plv8 có thể gọi các thư viện của bên thứ ba không?

  5. org.postgresql.util.PSQLException:Cố gắng kết nối không thành công