首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle SQL Developer限制数据类型字符数(5)

Oracle SQL Developer限制数据类型字符数(5)
EN

Stack Overflow用户
提问于 2020-10-30 10:07:33
回答 2查看 380关注 0票数 2

我的任务是实现一个具有可变群码的表。有几个要求。

  1. char(5)
  2. 2或大写字母加1到4之间的1位数字(例如,AA1,AABB1)
  3. ,任何其他违反第1点和第2点的输入都应禁止

我唯一能想到的就是regexp_like,但是我的努力是徒劳的,例如

代码语言:javascript
复制
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:

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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中还包括空格:

代码语言:javascript
复制
create table test
(
  groupcode char(5) check(
      regexp_like(groupcode, '(^[A-Z]{2}[0-9]  $)|(^[A-Z]{4}[0-9]$)', 'c'))
);

上面的正则表达式允许两个大写字符跟在数字后面,两个空格或大写字符跟在一个数字后面。

票数 2
EN

Stack Overflow用户

发布于 2020-10-30 10:09:15

我建议:

代码语言:javascript
复制
CREATE TABLE Test (
    groupcode VARCHAR(5),
    CONSTRAINT (CHECK(REGEXP_LIKE(groupcode, '^[A-Z]{2}([A-Z]{2})?[1-4]$', 'c')))
);

以下是regex模式的解释:

代码语言:javascript
复制
^                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。但你的霸王龙也有问题,我把它修好了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64606303

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档