sql >> データベース >  >> RDS >> PostgreSQL

指定されたテーブルでNULL値のみを持つ列を検索するPLpgSQL関数

    カタログテーブル pg_attribute> 定義されていない列のリストを取得するにはNOTNULL したがって、できます NULLを保持します 値:

    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;
    

    tbl は(オプションでスキーマ修飾された)テーブル名です。

    列に実際のNULL値があるとは言いません。各列をテストする必要があります。このように:

    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;
    

    電話:

    SELECT f_all_null_columns_of_tbl('my_schema.my_table');
    

    Postgres9.1および9.3でテスト済み。
    これは多くの高度なplpgsql機能を使用します。

    SQLフィドル。

    最新の構文を使用したSQLコードの構築と実行に関連する回答:

    レコードのトラバースについて:




    1. null以外の値を持つ同じ行がない場合にのみ、null値を持つ行を出力します

    2. Pl/SQL-クエリから列名を取得します

    3. PythonとMySQL:MySQLdbに代わるものはありますか?

    4. ストアドプロシージャからのデータの選択