SQL:检查约束以强制使用任意长度的正则表达式?

SQL:检查约束以强制使用任意长度的正则表达式?,sql,regex,postgresql,check-constraints,Sql,Regex,Postgresql,Check Constraints,我对regex还不熟悉,现在正在使用Postgres。我试图在一个表中做一个检查约束,这样任何进入某个列的数据总是只检查字母数字、数字、没有空格的字母数字等等 例如,给定如下表: CREATE TABLE client ( PRIMARY KEY (id), id CHAR(18) NOT NULL, name TEXT NOT NULL, promo_code TEXT NOT

我对regex还不熟悉,现在正在使用Postgres。我试图在一个表中做一个检查约束,这样任何进入某个列的数据总是只检查字母数字、数字、没有空格的字母数字等等

例如,给定如下表:

CREATE TABLE client (
PRIMARY KEY (id),
id                  CHAR(18)    NOT NULL,
name                TEXT        NOT NULL,
promo_code          TEXT        NOT NULL
);
我想用一个复选框来做一个约束,它只允许id中的字母数字不带空格内容,名称中的字母数字带空格,促销代码中的字母数字带符号不带空格内容。 id的长度严格为18,但名称和促销代码的长度可变

你想做以下工作吗

ALTER TABLE client
ADD CONSTRAINT ck_client_one
    CHECK (
        id ~ '%\w%' AND id !~ '%\s%',
        name ~ '%\w%' AND name !~ '%\d%',
        promo_code ~ '%\w%' OR promo_code ~ '%\W%' AND promo_code !~ '%\s%'
    );

ALTER TABLE client
ADD CONSTRAINT ck_client_two
    CHECK (
        id ~ '%^[a-zA-Z0-9]*%' AND id !~ '%\s%',
        name ~ '%^[a-zA-Z]*%',
        promo_code ~ '%^[a-zA-Z0-9]*%' OR promo_code !~ '%^[a-zA-Z0-9]*%' 
            AND promo_code !~ '%\s%'
    );
尼尔森研究所

ALTER TABLE client
ADD CONSTRAINT ck_client_one
    CHECK (
        id ~ '.+\w+.+' AND id !~ '.+\s+.+',
        name ~ '.+\w+.+' AND name !~ '.+\d+.+',
        promo_code ~ '.+\w+.+' OR promo_code ~ '.+\W+.+' 
            AND promo_code !~ '.+\s+.+'
    );

谢谢

类似于表达式的东西可以工作,但表达式包含SQL多字符通配符(“%”)和正则表达式语法的混合体。您应该删除“%”字符,并根据需要修改正则表达式。比如说,

'%\w%'
应该是

'.*\w*.*'

如果列不可为空,则
\w*
应改为
\w+
。其他表达式也应进行类似修改。

有几点值得一提:

  • %
    字符被
    LIKE
    表达式用作零或多个通配符。regex等价物是
    *
  • 如果要匹配整个字符串,则需要使用
    ^
    $
    锚定开始和结束。
    • 相反,未编排的模式的行为就像两端都有通配符一样;例如,
      \s
      ^.*\s.*$
      相同
  • \w
    匹配下划线,
    \s
    匹配制表符和换行符,这可能是您不允许的
  • ~*
    运算符执行不区分大小写的匹配,使您可以将
    [A-Za-z]
    简化为
    [A-z]
考虑到所有这些:

id ~* '^[a-z0-9]{18}$'
name ~* '^[a-z ]*$'
promo_code !~ '\s'
如果要确保
name
不是完全为空,请改用
^[a-z]+$


promo\u code
检查允许的不仅仅是“符号”;Unicode包含许多控制代码和不可打印字符,这些字符不算作“空格”。您可能需要使用显式白名单。

您使用的是Postgresql吗?`是的,我使用的是Postgresql,要知道,不同的产品在正则表达式方面并不完全兼容。是的,您的编辑看起来不错,因为它包含合法的正则表达式。CHECK语法使用逗号分隔不同列的表达式,但应改为使用
。或者您可以使用三个不同的检查表达式。您不需要在模式的开头和结尾使用
*
。@LaurenzAlba:啊,是的,您使用
'\w'
模式是正确的。它应该包含在
!~”中*\s、 *'
表达式。