Use Non deterministic collation (only PostgreSQL version >= 12):
From https://dba.stackexchange.com/questions/101294/how-to-create-postgres-db-with-case-insensitive-collation :
CREATE COLLATION ndcoll (provider = icu, locale = 'und', deterministic = false);
CREATE COLLATION case_insensitive (provider = icu, locale = 'und-u-ks-level2', deterministic = false);
CREATE COLLATION ignore_accents (provider = icu, locale = 'und-u-ks-level1-kc-true', deterministic = false);
Edit
From https://stackoverflow.com/a/59101567/2928168 :
CREATE COLLATION case_insensitive (
provider = icu,
locale = 'und-u-ks-level2',
deterministic = false
);
CREATE TABLE names(
first_name text,
/* Example collation used in schema directly */
last_name text COLLATE "case_insensitive",
);
insert into names values
('Anton','Egger'),
('Berta','egger'),
('Conrad','Egger');
select * from names
order by
last_name,
/* Example collation used only in some query */
first_name collate case_insensitive;