I'm trying to create an exclusion constraint that prevents overlapping effective timestamp ranges, but only compares ranges across records with the same text value. I'd like the text value comparison to be case insensitive. I can use the = operator with a text field, but not with a citext field, and the ~~* operator is not commutative.
This is PostgreSQL 9.5 and the citext and btree_gist extensions are created on the database.
CREATE TABLE customer_product_categories (
id serial PRIMARY KEY,
name text NOT NULL,
effective tstzrange DEFAULT '[-infinity,infinity]',
EXCLUDE USING gist (name WITH ~~*, effective WITH &&)
)
ERROR: operator ~~*(text,text) is not commutative
CREATE TABLE customer_product_categories (
id serial PRIMARY KEY,
name citext NOT NULL,
effective tstzrange DEFAULT '[-infinity,infinity]',
EXCLUDE USING gist (name WITH =, effective WITH &&)
)
ERROR: operator =(citext,citext) is not a member of operator family "gist_text_ops"
ILIKE not commutative?A-ha! I figured it out. I had to go old-school:
CREATE TABLE "customer_product_categories" (
"id" serial PRIMARY KEY,
"name" text NOT NULL,
"effective" tstzrange DEFAULT '[-infinity,infinity]',
EXCLUDE USING gist (LOWER("name") WITH =, "effective" WITH &&)
)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With