2016-02-05 166 views
1

我正在寫一篇PostGres check,以便將文本字段限制爲4個不同的值之一。我正在避免使用Enum類型,因爲它已知會導致問題。正則表達式IsOne vs包含

我似乎有更多的「包含」,而不是必須是其中之一。

ALTER TABLE registrations 
    ADD CONSTRAINT proper_confirmation_status CHECK (confirmation_status:: 
text ~* '^(Unconfirmed|Confirmed|Rejected|NotApplicable)'::text); 

所以:

  1. 字應該是那些4沒有任何附加的字符(開始或結束)中的一個。
  2. 支票應區分大小寫
  3. 目前confirmdddddd正確驗證,但confirmedSSSS
+0

如果整場應等於你的'|' - 分隔值,使用'^'和'$':' '^(未證實|確認|拒絕| NotApplicable的)$'' –

+0

@WiktorStribiżew我嘗試了你的建議,但失敗了(見上面的#3)。我只是意識到postgres運算符'〜*'可能是它匹配/包含與equals的關係。在問題中添加postgres標籤。 –

+0

'$'必須處理第3點OK。 –

回答

2

我認爲你應該使用IN運營商,而不是正則表達式。

ALTER TABLE registrations 
    ADD CONSTRAINT proper_confirmation_status CHECK (
    confirmation_status::text IN ('Unconfirmed', 'Confirmed', 'Rejected', 'NotApplicable')); 
2
  1. 使用~(案例靈敏),而不是~*(情況intenstive)
  2. 正則表達式應該是^(....)$(匹配整個字符串)
  3. 語法看起來有點討厭,它工作嗎?

    ALTER TABLE registrations 
        ADD CONSTRAINT proper_confirmation_status CHECK 
        (confirmation_status::text ~ '^(Unconfirmed|Confirmed|Rejected|NotApplicable)$');