简而言之,我试图为postgreSQL中遵循意大利车牌语法的字符串创建一个域。布局如下:
[2个字符+3个ditigs+2个字符](例如GS220PN)
所以我想我可以使用regex,根据PostgreSLQ文档,只需使用~*操作符和POSIX regex就可以使用它。
这是我想出的密码:
# create the domain
CREATE DOMAIN ITALIAN_LICENSE_PLATE AS VARCHAR(7) CHECK(
VALUE ~* '/[A-Z]{2}[0-9]{3}[A-Z]{2}'
);
# create table
CREATE TABLE car (
plate ITALIAN_LICENSE_PLATE PRIMARY KEY
model VARCHAR(30)
make VARCHAR(30));
# insert test
INSERT INTO car(plate, model, make) VALUES
('DS331NA', 'A4', 'AUDI');
我得到的是:
value for domain italian_license_plate violates check constraint "italian_license_plate_check".
因为'ds33ina'显然是2个字符+3个数字+2个字符,所以我的regex一定有问题。
我可能错过了一些琐碎的事情,但有人能启发我吗?
编辑:问题由顶部注释解决。原来一个有效的替代方法是用
SIMILAR TO
代替~*
。所以下面的代码是等价的,它们都可以工作:
(...) CHECK( VALUE SIMILAR TO '[A-Z]{2}[0-9]{3}[A-Z]{2}')
(...) CHECK ( VALUE ~* '^[A-Z]{2}[0-9]{3}[A-Z]{2}$')
最佳答案
你可以用
'^[A-Z]{2}[0-9]{3}[A-Z]{2}$'
注意,开头的
/
要求输入中的第一个字符是/
字符,因此它无法工作。锚定器断言字符串开始处的位置,
^
锚定器断言字符串结束处的位置。它们在这里有些多余,因为您在定义数据类型时指定了允许的长度,但是最好将它们保存在不使用自动锚定的环境中。关于sql - 使用正则表达式的自定义postgreSQL域,以接受特定的字符串集,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57297301/