Oracle SQL 开发人员限制数据类型 char(5) 的字符数

Oracle SQL Developer limit number of character of datatype char(5)

我的任务是使用可变组码实现 table。有几个要求。

  1. 字符(5)
  2. 2个或​​4个大写字母加上1个数值在1到4之间的数字(如AA1、AABB1)
  3. 任何违反第1点和第2点的输入都应该被禁止

我唯一能想到的就是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' 之类的东西。

我也对非正则表达式解决方案持开放态度。经过今天下午的工作,我开始怀疑自己的做法了。

编辑--致蒂姆:

我建议:

CREATE TABLE Test (
    groupcode VARCHAR(5),
    CONSTRAINT (CHECK(REGEXP_LIKE(groupcode, '^[A-Z]{2}([A-Z]{2})?[1-4]$', 'c')))
);

这里是对正则表达式模式的解释:

^                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

Demo

后期编辑:@Horse 的回答正确指出您应该在此处使用 VARCHAR。但是你的正则表达式也有问题,我已经解决了。

您的正则表达式 ^[A-Z]{2}[0-9]$ 只允许(恰好)三个字符。但是,如果您提供的列少于三个,则定义为 char(5) 的列会用空格填充,因此实际上 'AA1' 将存储为 'AA1 ',这违反了您的正则表达式。

改用char(3)

更好的是,根本不要使用 char(您只是遇到了原因之一),使用 varchar(5)varchar(3) 两者都可以与您的正则表达式一起使用。


2 or 4 uppercase letters plus 1 digit whose value is between 1 and 4

这不是您的正则表达式的作用。 [A-Z]{2} 正好 两个大写字母。如果您想允许不同长度的模式,则无法使用 char(5) 除非您还在正则表达式中包含空格:

create table test
(
  groupcode char(5) check(
      regexp_like(groupcode, '(^[A-Z]{2}[0-9]  $)|(^[A-Z]{4}[0-9]$)', 'c'))
);

上述正则表达式允许两个大写字符后跟一个数字和两个空格四个大写字符后跟一个数字。