【问题标题】:Oracle SQL Developer Postal CodeOracle SQL 开发人员邮政编码
【发布时间】:2017-12-06 23:17:09
【问题描述】:

我在使用 Oracle 11g Express Edition 的 Oracle SQL Developer 中遇到检查约束问题。

我想检查存储为CHAR 的邮政编码是否只包含数字而没有其他符号。

尝试了各种可能,但没有任何效果......

PLZ VARCHAR(5) NOT NULL

ADD CONSTRAINT TC_PLZ CHECK (PLZ LIKE '[0-9][0-9][0-9][0-9][0-9]')  

谢谢和最好的问候,
迈克尔

【问题讨论】:

标签: sql oracle oracle11g


【解决方案1】:

使用regexp_like():

ADD CONSTRAINT TC_PLZ CHECK ( regexp_like(PLZ, '^[0-9]{5}$') )

Oracle - 与大多数数据库一样 - 仅支持 LIKE 中的 ANSI 标准通配符。这些是 % 用于零个或多个字符,_ 仅用于一个字符。

正则表达式更强大(虽然通常速度较慢)。

这可能会更有效率:

ADD CONSTRAINT TC_PLZ CHECK (translate(PLZ, '0123456789', '000000000') = '00000')

虽然为了清楚起见我会使用正则表达式。

【讨论】:

  • 清晰在旁观者的眼中。很多人——包括许多程序员——不懂正则表达式。因此,尽管给出了正则表达式解决方案,我仍会在我的数据模型中使用 translate() 解决方案
  • 非常感谢!尝试使用 RegExp 但失败了,可能是因为我认为缺少“$”...您的解决方案立即生效:)
【解决方案2】:

如果您想使用正则表达式模式,您需要在 CHECK 约束中使用正则表达式函数。这将起作用:

create table t23 (

PLZ VARCHAR(5) NOT NULL
, CONSTRAINT TC_PLZ CHECK (regexp_LIKE(plz, '^[0-9]{5}$'))
);

虽然不需要正则表达式;这是另一种实现方式:

create table t42 (

PLZ NUMBER(5,0) NOT NULL
, CONSTRAINT T42_PLZ CHECK (length(plz)=5)
);

最好使用正确的数据类型存储数值。

查看this LiveSQL demo


正如@MT0 指出的那样,如果有效值可以以前导零开头,则数字实现是不正确的。我的纯粹数据建模者角色指出,必须为固定位数的值应从 10000 开始(对于五位数的值)。但是,我必须承认,我知道有一个系统确实允许在“数字”字段中使用前导零。他们通过允许可变级别值来复杂化这一点,这意味着代码0300 识别出与00300 不同的东西。什么百灵鸟!

【讨论】:

  • 将其存储为NUMBER 数据类型不会保留前导零,因此用户可以输入00001,这将是一个有效字符串,但数据库会将其转换为1,这将失败支票。
猜你喜欢
  • 1970-01-01
  • 2022-07-19
  • 2012-03-21
  • 2021-01-08
  • 2020-06-06
  • 2012-07-05
  • 1970-01-01
  • 1970-01-01
  • 2019-02-25
相关资源
最近更新 更多