我有一个专栏,比如PROD_NUM,其中包含一个用零填充的"数字".例如001004569.它们都是九个字符长.
我不使用数字类型,因为对数字的正常操作对这些"数字"没有意义(例如PROD_NUM*2没有任何意义.)并且因为它们的长度都相同,所以列定义为CHAR(9)
CREATE TABLE PRODUCT (
PROD_NUM CHAR(9) NOT NULL
-- ETC.
)
Run Code Online (Sandbox Code Playgroud)
我想约束PROD_NUM所以它只能包含九位数.没有空格,除了'0'到'9'之外没有其他字符
Tim*_*ter 15
REGEXP_LIKE(PROD_NUM, '^[[:digit:]]{9}$')
Run Code Online (Sandbox Code Playgroud)
Rob*_*ijk 12
您已经收到了关于如何继续当前路径的一些很好的答案.请允许我建议一个不同的路径:使用数字(9,0)数据类型.
原因:
您不需要额外的检查约束来确认它包含实数.
你不是在愚弄优化器.例如,有多少prod_num是"BETWEEN'0000009'和'000000010'"?那里有很多字符串.而"9到10之间的prod_num"显然只选择两个数字.基数会更好,从而导致更好的执行计划.
你不是在愚弄未来需要维护代码的同事.将其命名为"prod_num"会让它们自动假设它包含一个数字.
您的应用程序可以使用lpad(to_char(prod_num),9,'0'),最好在视图中显示.
问候,Rob.
(由MH更新)评论主题有一个讨论,很好地说明了这种方法需要考虑的各种事项.如果这个主题很有趣,你应该阅读它们.
适用于所有版本:
TRANSLATE(PROD_NUM,'123456789','000000000') = '000000000'
Run Code Online (Sandbox Code Playgroud)