2016-08-17 2 views
2

有効なタイムスタンプの範囲が重複しないようにするために、同じテキスト値を持つレコードの範囲を比較するだけの除外の制約を作成しようとしています。私は大文字小文字を区別しないテキスト値の比較をしたいと思います。テキストフィールドでは=演算子を使用できますが、citextフィールドでは使用できません。~~*演算子は可換性がありません。Postgresの大文字と小文字を区別しない除外の制約

これはPostgreSQL 9.5で、citextbtree_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" 
  • 私がやろうとしていることをする方法はありますか、私は愚かな言葉を使わないのですか?
+2

バイナリ操作は[可換](https://en.wikipedia.org/wiki/Commutative_property)であれば、結果は変わりませんオペランドの順序を変更します。 ILIKEは可換ではありません。 '' a '~~ *'%a''は真ですが ''%a '~~ *' a''は偽です。 – klin

+0

Duh。ワイルドカード。 @klinに感謝します。 – mwp

答えて

2

A-ha!私はそれを考え出した。私は古い学校を行かなければならなかった:

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 &&) 
) 
+0

このEXCLUDE文は 'name'カラムを' citext'にしても機能します。 –

+0

@NikitaZhukはい、私は 'name'を' citext'にする必要はありませんでしたが、 'EXCLUDE'作業をしようとするために型を変更していました。 – mwp

関連する問題