sql - 使用正则表达式自定义 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}$')
解决方案
您可以使用
'^[A-Z]{2}[0-9]{3}[A-Z]{2}$'
请注意/
,开头需要一个/
字符作为输入中的第一个字符,因此它无法工作。
^
锚点断言字符串开头的位置,锚点$
断言字符串结尾的位置。它们在这里有些多余,因为您在定义数据类型时指出了允许的长度,但最好将它们保留在不使用自动锚定的环境中。
推荐阅读
- c++ - 将 boost::format 与 std::vector 一起使用
- python - 如何在 Ansible 的同一个自定义模块中执行两个不同的功能?
- python - send_keys 选择了错误的选项 [selenium python]
- python - 用于多个输入变量的 JAX 自定义 VJP 函数不适用于 NumPyro/HMC-NUTS
- python-3.x - 如何在 CSV 文件 python-3 中查找字符串
- python - Python电报机器人(Telebot)
- c# - .Net Core 不路由到 POST 方法,但 GET 方法有效
- php - Swagger UI Access-Control-Allow-Origin 错误
- python - 右键单击-Selenium - Python
- asp.net - ASP.NET MVC Razor SQL 表