举个例子,定义一个字段名为“身份证”,加一个约束在列“身份证”上,限定其只能为15位或18位长度的数字字符串。这时想用到like来限定,oracle里面的"[]"也不知道怎么用,拜托大虾们指点!谢谢!

解决方案 »

  1.   

    like是不能限定的,oracle10g里面可以用正则表达式限制的
      

  2.   

    使用check 
    SQL> create table test (sfz varchar2(18));Table createdSQL> alter table test add constraint ck_test_sfz check (length(sfz)=15 or length(sfz)=18);Table altered
      

  3.   

    再说明一下,我用的是oracle92,一个有点郁闷的版本,希望大虾们帮忙一下,在此不胜感激!
      

  4.   

    10 G才可以用正则表达式。2楼的可以帮你搞定长度,如果你的数据类型为number的刚好可以。为字符型的还需要判断数字和字母了
      

  5.   

    能达到要求的笨方法
    create table test (sfz varchar2(18));
    alter table test add constraint ck_test_sfz check (DECODE(length(sfz), 15, 1, DECODE(length(sfz), 18, 1, 0)) = 1 and (NVL(LENGTH(REPLACE(TRANSLATE(sfz, '1234567890',' '), ' ','')), 0) = 0));
      

  6.   

    不知道你的里面能不能用TRANSLATE函数,可以的话可以加约束
    SQL> create table t(x number check (TRANSLATE(x,'0123456789','999999999999999')=999999999999999 o
    r TRANSLATE(x,'0123456789','999999999999999999')=999999999999999999 ));表已创建。SQL> insert into t values(123456789012345);已创建 1 行。SQL> insert into t values(1234567890123456);
    insert into t values(1234567890123456)
    *
    第 1 行出现错误:
    ORA-02290: 违反检查约束条件 (WF.SYS_C0010137)
    SQL> insert into t values(123456789012345678);已创建 1 行。