PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Funkcja PLpgSQL do wyszukiwania kolumn zawierających tylko wartości NULL w danej tabeli

Możesz wysłać zapytanie do tabeli katalogu pg_attribute aby uzyskać listę kolumn, które nie są zdefiniowane NOT NULL i dlatego może przytrzymaj NULL wartości:

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;

Gdzie tbl to nazwa Twojej tabeli (opcjonalnie kwalifikowana według schematu).

Nie mówi, że w kolumnie znajdują się rzeczywiste wartości NULL. Musiałbyś przetestować każdą kolumnę. Tak:

Pełna automatyzacja z funkcją 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;

Zadzwoń:

SELECT f_all_null_columns_of_tbl('my_schema.my_table');

Testowane z Postgresem 9.1 i 9.3.
Wykorzystuje wiele zaawansowanych funkcji plpgsql.

Skrzypce SQL.

Powiązana odpowiedź budowanie kodu SQL i wykonywanie go z nowoczesną składnią:

Informacje o przemierzaniu rekordu:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sprawdzenie minimalnej zmienności w R lub PostgreSQL

  2. Ustaw niestandardową strefę czasową w Django/PostgreSQL (Indyjski czas standardowy)

  3. Wykryj, czy wartość zawiera przynajmniej jedną cyfrę w PostgreSQL

  4. Ponowne próbkowanie danych szeregów czasowych

  5. Zbiorcza aktualizacja w postgreSQL za pomocą unnest