WITH checks AS (SELECT ccu.table_schema, ccu.table_name, t.table_type, ccu.column_name, cc.check_clause, cc.constraint_name, 'TABLE CHECK' AS check_type, NULL AS domain_schema, NULL AS domain_name
FROM INFORMATION_SCHEMA.constraint_column_usage AS ccu INNER JOIN INFORMATION_SCHEMA.check_constraints AS cc USING (constraint_schema, constraint_name)
INNER JOIN INFORMATION_SCHEMA.tables AS t USING (table_schema, table_name)
WHERE cc.check_clause NOT LIKE '%IS NOT NULL' AND
ccu.table_schema NOT IN (SELECT schema_name
FROM INFORMATION_SCHEMA.schemata
WHERE schema_name<>'public' AND
schema_owner='postgres' AND schema_name IS NOT NULL)
UNION SELECT cdu.table_schema, cdu.table_name, t.table_type, cdu.column_name, cc.check_clause, cc.constraint_name, 'DOMAIN CHECK' AS check_type, cdu.domain_schema, cdu.domain_name
FROM INFORMATION_SCHEMA.column_domain_usage AS cdu INNER JOIN INFORMATION_SCHEMA.tables AS t USING (table_schema, table_name)
INNER JOIN INFORMATION_SCHEMA.domain_constraints AS dc USING (domain_schema, domain_name)
INNER JOIN INFORMATION_SCHEMA.check_constraints AS cc USING (constraint_schema, constraint_name)
WHERE t.table_type IN ('BASE TABLE','FOREIGN') AND cc.check_clause NOT LIKE '%IS NOT NULL' AND
cdu.table_schema NOT IN (SELECT schema_name
FROM INFORMATION_SCHEMA.schemata
WHERE schema_name<>'public' AND
schema_owner='postgres' AND schema_name IS NOT NULL)),
checks_columns AS (SELECT table_schema, table_name, table_type, array_agg(column_name) AS columns, check_clause, constraint_name, check_type, domain_schema, domain_name
FROM checks
GROUP BY table_schema, table_name, table_type, check_clause, constraint_name, check_type, domain_schema, domain_name)
SELECT table_schema, table_name, table_type, columns, check_clause, constraint_name, check_type, domain_schema, domain_name
FROM checks_columns
WHERE check_clause!~*'[[:space:]]OR[[:space:]]'
AND (
(cardinality(columns)>1 AND check_type='TABLE CHECK' AND check_clause~*'[[:space:]]AND[[:space:]]')
OR ((cardinality(columns)=1 OR check_type='DOMAIN CHECK') AND check_clause~*'(.*[[:space:]]AND[[:space:]].*){2,}')
)
ORDER BY table_schema, table_name;