现有如下一列数据,现在我只想获取该列中所有为“xxxx-xxxx-”这种类型的数据的SQL语句如何写,请教SQL高人帮忙解决一下。
ID       Assort_Code
1 0000-0003-0002-
2 0000-0005-0001-
3 0000-0005-0001-0001-
4 0000-0005-0002-
5 0000-0001-0004-
6 0000-0003-
7 0000-0003-0001-
8 0000-0005-0003-
9 0000-0005-0004-
10 0000-0006-0001-
11 0000-0005-0006-
12 0000-0005-0013-
13 0000-0005-0014-
14 0000-0005-0017-
15 0000-0005-0019-
16 0000-0005-0020-
17 0000-0006-
18 0000-0005-0002--
19 0000-0005-0001-0003-
20 0000
21 0000-0001-0002-
22 0000-0001-0003-
23 0000-0002-
24 0000-0004-
25 0000-0005-
26 0000-0005-0002-0001-
27 0000-0005-0002-0002-
28 0000-0005-0001-0002-
29 0000-0005-0007-
30 0000-0005-0008-
31 0000-0005-0010-
32 0000-0005-0011-
33 0000-0001-
34 0000-0001-0001-
35 0000-0005-0012-
36 0000-0005-0015-
37 0000-0005-0016-
38 0000-0005-0018-
39 0000-0005-0021-
40 0000-0005-0022-
41 0000-0001-0001-
42 0000-00009
43 0000-0006-0002-
44 0000-0006-0005-
45 0000-0005-2222

解决方案 »

  1.   

    select *
      from table_name
    where Assort_Code like '____-____-'
    ;
      

  2.   

    select * from t where regexp_like(Assort_Code,'^([[:digit:]]{4}-){1,}([[:digit:]]{4}-){1,}$|^[[:digit:]]{4}-$');
      

  3.   

    只要 xxxx-xxxx-类型的,则select * from t where regexp_like(Assort_Code,'^([[:digit:]]{4}-){2}$');
      

  4.   

    select * from t 
    where length(t.Assort_Code)=10;
    如果数据是规则的,判断长度即可
      

  5.   

    恩是的,我用的是oracle9i版本的
      

  6.   

    版本问题吧,10g以上才支持regexp_like
    数据像例子中那么规则的话确实可以试试按长度
    判断2个分隔符可以用
    where length(Assort_Code)-length(replace(Assort_Code,'-',''))=2
      

  7.   

    1楼那个已经实现了呀或者用长度判断如#9或者用instr判断,写成select * from t where instr(Assort_Code,'-',1,2) > 0;
      

  8.   

    这里不能够用regexp,所以没法使用正则表达式
      

  9.   

    select * from t where instr(Assort_Code,'-',-1,1) = 10;
      

  10.   

    恩,那就是当且仅当有两个-时,这种情况下#1的不能满足要求instr(Assort_Code,'-',1,2) > 0 and (Assort_Code,'-',1,3) < 0;
      

  11.   

    select * from t where instr(Assort_Code,'-',-1,1) = instr(Assort_Code,'-',1,2);
    这个如何
      

  12.   

    您的这个SQL还是有点问题,我只要xxxx-xxxx-这样的数据现在这个里面多余了'0000'和'0000-0005-2222'
    1 0000-0003-
    2 0000-0006-
    3 0000
    4 0000-0002-
    5 0000-0004-
    6 0000-0005-
    7 0000-0001-
    8 0000-0005-2222
      

  13.   

    我看这能这样了:select * from t where Assort_Code like '____-____-' and length(Assort_Code) = 10;
      

  14.   

    select * from t where instr(Assort_Code,'-',-1,1) = instr(Assort_Code,'-',1,2)
      and Assort_Code like '%-'; 
      

  15.   

    测试了下,#1的就可以了,后面的and多余了,忽略#23