我的任务是实现一个具有可变群码的表。有几个要求。
我唯一能想到的就是regexp_like,但是我的努力是徒劳的,例如
create table Test(
groupcode char(5) check(
regexp_like(groupcode, '^[A-Z]{2}[0-9]$', 'c')
)
);
INSERT INTO Test(groupcode) VALUES ('AA1');我插入了这个,但它一直告诉我有一些违规行为,其中我不明白。
我指定^和$是因为我不希望出现类似'bbAA1'或'AA1bb'之类的东西。
我也对非正则解持开放态度。在今天下午做了这么多工作之后,我开始怀疑我的做法。
编辑--致Tim:

发布于 2020-10-30 10:21:49
regex ^[A-Z]{2}[0-9]$只允许(准确地)三个字符。但是,定义为char(5)的列如果提供少于三个空间,则会填充空格,因此实际上'AA1'将存储为违反正则表达式的'AA1 '。
使用char(3)代替。
更好的是,永远不要使用char (您刚刚经历了其中一个原因),使用varchar(5)或varchar(3)都将与正则表达式一起工作。
2或4个大写字母加值介于1和4之间的1位数字
你的霸王龙可不是这么做的。[A-Z]{2}是,正好是两个大写字母。如果希望允许不同长度的模式,则无法使用char(5),除非在regex中还包括空格:
create table test
(
groupcode char(5) check(
regexp_like(groupcode, '(^[A-Z]{2}[0-9] $)|(^[A-Z]{4}[0-9]$)', 'c'))
);上面的正则表达式允许两个大写字符跟在数字后面,两个空格或大写字符跟在一个数字后面。
发布于 2020-10-30 10:09:15
我建议:
CREATE TABLE Test (
groupcode VARCHAR(5),
CONSTRAINT (CHECK(REGEXP_LIKE(groupcode, '^[A-Z]{2}([A-Z]{2})?[1-4]$', 'c')))
);以下是regex模式的解释:
^ from the start of the column
[A-Z]{2} match AA, AB, BB, etc.
([A-Z]{2})? then match another optional AA, AB, BB, etc.
[1-4] match 1-4
$ end of the column
延迟编辑:@Horse的回答正确地指出,您应该在这里使用VARCHAR。但你的霸王龙也有问题,我把它修好了。
https://stackoverflow.com/questions/64606303
复制相似问题