आप कैटलॉग तालिका pg_attribute
उन स्तंभों की सूची प्राप्त करने के लिए जिन्हें परिभाषित नहीं किया गया है शून्य नहीं
और इसलिए कर सकते हैं नल
होल्ड करें मान:
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');
Postgres 9.1 और 9.3 के साथ परीक्षण किया गया।
यह कई उन्नत plpgsql सुविधाओं का उपयोग करता है।
संबंधित उत्तर आधुनिक वाक्य रचना के साथ SQL कोड बनाना और उसे क्रियान्वित करना:
किसी रिकॉर्ड को ट्रेस करने के बारे में: