我有一个专栏,说PROD_NUM包含一个用零填充的“数字”。例如001004569.它们都是九个字符长。
我不使用数字类型,因为对数字的正常操作对这些“数字”没有意义(例如PROD_NUM * 2没有任何意义。)因为它们的长度都相同,所以列是定义为CHAR(9)
CREATE TABLE PRODUCT (
PROD_NUM CHAR(9) NOT NULL
-- ETC.
)
我想约束PROD_NUM,所以它只能包含九位数字。没有空格,除了'0'到'9'之外没有其他字符
答案 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 );