首页 > 解决方案 > 使用正则表达式自定义 postgreSQL 域以接受一组字符串

问题描述

简而言之,我正在尝试为在postgreSQL中遵循意大利车牌语法的字符串创建一个域。布局如下:

[ 2 个字符 + 3 个数字 + 2 个字符](例如GS220PN

所以我想我可以使用一个正则表达式,根据 PostgreSLQ 文档,它可以通过使用 ~* 运算符和一个 POSIX 正则表达式来使用。

这是我想出的代码:

# 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".

由于“DS331NA”显然是 2 个字符 + 3 个数字 + 2 个字符,所以我的正则表达式一定有问题。

我可能会错过一些微不足道的事情,但是有人可以启发我吗?

编辑:顶级评论解决了问题。事实证明,一个有效的替代方案是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}$')

标签: sqlregexpostgresql

解决方案


您可以使用

'^[A-Z]{2}[0-9]{3}[A-Z]{2}$'

请注意/,开头需要一个/字符作为输入中的第一个字符,因此它无法工作。

^锚点断言字符串开头的位置,锚点$断言字符串结尾的位置。它们在这里有些多余,因为您在定义数据类型时指出了允许的长度,但最好将它们保留在不使用自动锚定的环境中。


推荐阅读