我想在一个字段中检测字段中有没有"1","2","3"..."9"或者"一","二"..."九"等字符,除了用Like还能有别的方式吗?

解决方案 »

  1.   

    instr()函数也可以
    select * from tb where instr(name,'1')>0
      

  2.   

    自定义方法吧
    参考:
     --文件解析时,校验姓名中是否存在非法字符
      FUNCTION F_CHECK_REAL_NAME(REAL_NAME VARCHAR2) RETURN NUMBER IS
      BEGIN
        IF INSTR(REAL_NAME, '。') > 0 THEN
          RETURN INSTR(REAL_NAME, '。');
        END IF;
        IF INSTR(REAL_NAME, ',') > 0 THEN
          RETURN INSTR(REAL_NAME, ',');
        END IF;
        IF INSTR(REAL_NAME, '(') > 0 THEN
          RETURN INSTR(REAL_NAME, '(');
        END IF;
        IF INSTR(REAL_NAME, ')') > 0 THEN
          RETURN INSTR(REAL_NAME, ')');
        END IF;
        IF INSTR(REAL_NAME, '-') > 0 THEN
          RETURN INSTR(REAL_NAME, '-');
        END IF;
        IF INSTR(REAL_NAME, ';') > 0 THEN
          RETURN INSTR(REAL_NAME, ';');
        END IF;
        IF INSTR(REAL_NAME, '‘') > 0 THEN
          RETURN INSTR(REAL_NAME, '‘');
        END IF;
        IF INSTR(REAL_NAME, '“') > 0 THEN
          RETURN INSTR(REAL_NAME, '“');
        END IF;
        IF INSTR(REAL_NAME, '’') > 0 THEN
          RETURN INSTR(REAL_NAME, '’');
        END IF;
        IF INSTR(REAL_NAME, '”') > 0 THEN
          RETURN INSTR(REAL_NAME, '”');
        END IF;
        IF INSTR(REAL_NAME, ',') > 0 THEN
          RETURN INSTR(REAL_NAME, ',');
        END IF;
        IF INSTR(REAL_NAME, ';') > 0 THEN
          RETURN INSTR(REAL_NAME, ';');
        END IF;
        IF INSTR(REAL_NAME, ':') > 0 THEN
          RETURN INSTR(REAL_NAME, ':');
        END IF;
        IF INSTR(REAL_NAME, ':') > 0 THEN
          RETURN INSTR(REAL_NAME, ':');
        END IF;
        RETURN 0;
      END F_CHECK_REAL_NAME;
      

  3.   

    CREATE TYPE INTEGER_TT AS TABLE OF INTEGER
    /DECLARE
      p_list CONSTANT INTEGER_TT := INTEGER_TT(21, 22, 23, 24);--这个可以程序里面赋值,也不一定要INTEGER,自己改吧
      v_sql varchar2(10000);
      v_name varchar2(200);
      v_id number;
    BEGIN  
      v_sql := 'SELECT object_name, object_id
                  FROM all_objects
                 WHERE object_id IN
                       (SELECT column_value FROM TABLE(:1)) and rownum = 1';
      execute immediate v_sql into v_name, v_id using p_list;
      DBMS_OUTPUT.PUT_LINE(v_name || ':' || v_id);
    END;
    /
      

  4.   

    Oracle10g使用正则表达式能把所有包含数据字符的串找出来,如create table charcheck(str varchar2(10));insert into charcheck values('110');
    insert into charcheck values('abc');
    insert into charcheck values('x10');
    insert into charcheck values('zzz');
    insert into charcheck values('一');
    insert into charcheck values('大');
    insert into charcheck values('a1t');
    insert into charcheck values('不');
    commit;
    select str from charcheck where regexp_like(str,'[[:digit:]]');STR
    ----------
    110
    x10
    a1t但是要检测汉字的话用存储过程了比较好.
      

  5.   

    感谢楼上的弟兄们,10g的正则表达式方法太强了,今天又学了一招,对于instr的方法,能够确定他的速度比like快吗?有没有过相关的试验呢?
    另外,palm_civet兄弟,你的这句
     'SELECT object_name, object_id 
                  FROM all_objects 
                WHERE object_id IN 
                      (SELECT column_value FROM TABLE(:1)) and rownum = 1'
    我有点看不懂,能给解释一下吗?
      

  6.   

    使用translate函数:
    SELECT TRANSLATE(EMPNO, '*123456789一二三四五六七八九十', '*'), EMPNO
      FROM SCOTT.EMP S
     WHERE LENGTH(TRANSLATE(EMPNO, '*123456789一二三四五六七八九十', '*')) <
           LENGTH(EMPNO);
    返回:
    00 7900
    0 7902
      

  7.   

    如果是10g的话,可以考虑用正则式,如REGEXP_LIKE '^([a-z]+|[0-9]+)$'