检查字符串的CONSTRAINT只包含数字。 (Oracle SQL)

时间:2009-07-22 19:46:29

标签: sql oracle

我有一个专栏,说PROD_NUM包含一个用零填充的“数字”。例如001004569.它们都是九个字符长。

我不使用数字类型,因为对数字的正常操作对这些“数字”没有意义(例如PROD_NUM * 2没有任何意义。)因为它们的长度都相同,所以列是定义为CHAR(9)

CREATE TABLE PRODUCT (
    PROD_NUM CHAR(9) NOT NULL
    -- ETC.
)

我想约束PROD_NUM,所以它只能包含九位数字。没有空格,除了'0'到'9'之外没有其他字符

8 个答案:

答案 0 :(得分:15)

REGEXP_LIKE(PROD_NUM, '^[[:digit:]]{9}$')

答案 1 :(得分:12)

您已经收到了一些关于如何继续当前路径的好答案。请允许我建议一个不同的路径:改为使用数字(9,0)数据类型。

原因:

  • 您不需要额外的检查约束来确认它包含实数。

  • 你不是在愚弄优化器。例如,有多少prod_num是“BETWEEN'0000009'和'000000010'”?那里有很多字符串。而“9到10之间的prod_num”显然只选择两个数字。基数会更好,从而产生更好的执行计划。

  • 您不是在愚弄未来需要维护代码的同事。将其命名为“prod_num”会让它们自动假设它包含一个数字。

您的应用程序可以使用lpad(to_char(prod_num),9,'0'),最好在视图中显示。

此致 罗布。

(由MH更新)评论主题有一个讨论,很好地说明了这种方法需要考虑的各种事项。如果这个主题很有意思,你应该阅读它们。

答案 2 :(得分:7)

适用于所有版本:

TRANSLATE(PROD_NUM,'123456789','000000000') = '000000000'

答案 3 :(得分:1)

我认为Codebender的regexp工作正常,但我怀疑它有点慢。

你可以做(​​未经测试)

replace(translate(prod_num,'0123456789','NNNNNNNNNN'),'N',null)为空

答案 4 :(得分:0)

将它转换为整数,将其强制转换为varchar,并检查它是否等于原始字符串?

答案 5 :(得分:0)

在MSSQL中,我可能会使用类似的东西作为约束测试:

PROD_NUM NOT LIKE '%[^0-9]%'

我不是甲骨文的人,但我认为他们不支持括号内的字符列表。

答案 6 :(得分:0)

在MS SQL服务器中我使用此命令: alter table add constraint [cc_mytable_myfield] check(cast(myfield as bigint)> 0)

答案 7 :(得分:-1)

不确定性能,但如果您知道范围,以下内容将起作用。 在创建DDL时使用CHECK约束。

alter table test add jz2 varchar2(4)
     check ( jz2 between 1 and 2000000 );

alter table test add jz2 varchar2(4)
     check ( jz2 in (1,2,3)  );

这也可行

alter table test add jz2 varchar2(4)
         check ( jz2 > 0  );