2016-02-05 181 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)$');