如何使用PostgreSQL查找任何列中具有NULL值的所有行

9lowa7mx  于 2023-06-29  发布在  PostgreSQL
关注(0)|答案(2)|浏览(182)

有许多“稍微相似”的问题,但没有一个能准确地解决这个问题。“Find All Rows With Null Value(s) in Any Column”是我能找到的最接近的一个,它为SQL Server提供了一个答案,但我正在寻找一种在PostgreSQL中实现这一点的方法。
如何只选择 any 列中具有NULL值的行?
我可以很容易地得到所有的列名:

select column_name from information_schema.columns where table_name = 'A';

但不清楚如何检查多个列名的NULL值。显然这行不通:

select* from A where (
  select column_name from information_schema.columns where table_name = 'A';
) IS NULL;

搜索也没有发现任何有用的东西。

3df52oht

3df52oht1#

可以使用NOT(<table> IS NOT NULL)
the documentation
如果表达式是行值的,则当行表达式本身为空或所有行的字段都为空时,IS NULL为真,而当行表达式本身为非空且所有行的字段都为非空时,IS NOT NULL为真。
所以:

SELECT * FROM t;
┌────────┬────────┐
│   f1   │   f2   │
├────────┼────────┤
│ (null) │      1 │
│      2 │ (null) │
│ (null) │ (null) │
│      3 │      4 │
└────────┴────────┘
(4 rows)

SELECT * FROM t WHERE NOT (t IS NOT NULL);
┌────────┬────────┐
│   f1   │   f2   │
├────────┼────────┤
│ (null) │      1 │
│      2 │ (null) │
│ (null) │ (null) │
└────────┴────────┘
(3 rows)
zf2sa74q

zf2sa74q2#

得到列和表的列表后,可以使用LOOPEXECUTE逐一运行它们。
这不会以表格的形式给予你答案,但至少你可以通过RAISE NOTICE s来观察它,至于我的用例,这只是维护/修补工作的一部分。

DO $$ 
DECLARE 
    id_columns TEXT;
    id_column_tables TEXT;
    null_count INTEGER;
BEGIN
    FOR id_columns, id_column_tables IN (
        SELECT column_name, table_name
        FROM information_schema.columns 
        WHERE table_name = 'A' 
    )
    LOOP
        EXECUTE FORMAT(
            'SELECT COUNT(*) FROM %I WHERE %I is null',
            id_column_tables,
            id_columns
        ) INTO null_count;
        
        IF null_count > 0 then
            RAISE NOTICE 'Column: % in TABLE: % - Null Count: %', id_columns, id_column_tables, null_count;
        END IF;
    END LOOP;
END $$;

相关问题