Postgresql

使用正則表達式的約束檢查值

  • October 16, 2021

在帶有欄位的表中code,我想授權使用者從列表中選擇一個值。

以下是列表值的範例:

A|AG|AL|AS|B|C|D|DA

我添加了這樣的約束code

ALTER TABLE mytable
ADD CONSTRAINT verif_code CHECK (code::text ~ '(A|AG|AL|AS|B|C|D|DA)')

儘管如此,我可以在列表中選擇第一個之後添加一個額外的值。

ALY accepted -> :(
Y   rejected -> :)

如何避免在第二個位置添加一個不在列表中的值的可能性?

(我可以使用IN運算符,但最後,授權值code將是三組列表的組合。)

該值與條件匹配,因為它包含A.

正則表達式不僅理解起來很複雜,而且處理起來也很昂貴(這兩者之間存在聯繫)。所以,如果你可以沒有它們,那就去做吧。

在這種情況下,檢查約束應該是

ALTER TABLE mytable
ADD CONSTRAINT verif_code CHECK (code IN ('A', 'AG', 'AL', 'AS', 'B', 'C', 'D', 'DA'));

類似於ypercubeᵀᴹ 的建議:

如果我理解正確,它可能可以用一個複雜的正則表達式來解決,例如CHECK (code SIMILAR TO '(A|AG|AL|AS|B|C|D|DA)(1|2|3|4)(X|Y|Z)')一個由 3 個部分組成的程式碼,第一個部分如問題中所述,第二部分是從 1 到 4 的數字和字元的第三部分, X、Y 或 Z。

此表達式按預期工作:

code SIMILAR TO ('(A|AG|AL|AS|B|C|D|DA|DL|DS|G|GA)(d|h|l|m)?(_lab|_g|_h|_o)?')

第一個列表的一個元素後跟或不跟隨第二個列表的一個元素,後跟或不跟隨第三個列表的一個元素。

例如:廣告;AG_g ; DSh_lab。

引用自:https://dba.stackexchange.com/questions/301169