Interesting things I've learned: Counting nulls and non-nulls in Postgres

The num_nonnulls and num_nulls functions in Postgres

num_nonnulls(...) counts the number of provided arguments that are not null.

SELECT num_nonnulls('a', 'b', null); 
-- Returns 2

num_nulls(...) counts the number of provided arguments that are null.

SELECT num_nulls('a', 'b', null); 
-- Returns 1

This is useful in a check constraint, if you need to ensure that exactly some number of columns are provided

CREATE TABLE purchase_order (
    id UUID PRIMARY KEY,
    contact_email TEXT NULL,
    contact_phone TEXT NULL
);
 
-- If we want to ensure that at least one of email or phone is provided 
-- when making a purchase order, we can add a check constraint using 
-- `num_nonnulls`
ALTER TABLE purchase_order ADD CONSTRAINT contact_info_check CHECK (
    num_nonnulls(contact_email, contact_phone) >= 1
);

num_nonnulls and num_nulls are available in Postgres 9.6+ (docs)


Like this article? Follow me on Bluesky or subscribe to the RSS feed to get notified about new articles.