有効なタイムスタンプの範囲が重複しないようにするために、同じテキスト値を持つレコードの範囲を比較するだけの除外の制約を作成しようとしています。私は大文字小文字を区別しないテキスト値の比較をしたいと思います。テキストフィールドでは=
演算子を使用できますが、citext
フィールドでは使用できません。~~*
演算子は可換性がありません。Postgresの大文字と小文字を区別しない除外の制約
これはPostgreSQL 9.5で、citext
とbtree_gist
という拡張子がデータベースに作成されています。 ILIKE
可換ではありませんどのように
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"
- ?
- 私がやろうとしていることをする方法はありますか、私は愚かな言葉を使わないのですか?
バイナリ操作は[可換](https://en.wikipedia.org/wiki/Commutative_property)であれば、結果は変わりませんオペランドの順序を変更します。 ILIKEは可換ではありません。 '' a '~~ *'%a''は真ですが ''%a '~~ *' a''は偽です。 – klin
Duh。ワイルドカード。 @klinに感謝します。 – mwp