例如这样的语句:
select * from tableName A where A.code like '101%' or A.code like '102%'
想把它写成IN子句的,比如这样:
select * from tableName A where A.code In ('101%','102%')
当然上面这样写法是不正确的,但是就是这个意思,有哪位大侠帮忙给个正确的写法?小弟先谢过了... 

解决方案 »

  1.   

    你看看下面的写法时候可以满足你的需求SELECT 
        * 
    FROM 
        tableName
    WHERE
        SUBSTR(A.code, 1, 3) IN ('101', '102')
      

  2.   

    three_stone_liu:这个方法好像不太行啊.如果我的条件是101,102,1001怎么办啊?这个长度没办法确定的呀
      

  3.   

    SELECT 
        * 
    FROM 
        tableName
    WHERE
        SUBSTR(A.code, 1, 3) IN ('101', '102')
    这个方法是可以的,意思是从字符串的第一个位置截取字符,取三个字符,跟字符长短没有什么关系
      

  4.   

    有种办法,把你IN的字符串生成一个结果集,然后用instr来实现
      

  5.   

     楼主要如果是in('101','102','1001')
    你有个数据是111002
    明显不符合要求的
    但用你的SUBSTR就会符合要求了
      

  6.   

    佛瑞偶一:
    你说的这个不行的.比如就取前三位来说,我可能条件是101,102,1001,如果按照这个做法,语句应该是
    SELECT 
        * 
    FROM 
        tableName 
    WHERE 
        SUBSTR(A.code, 1, 3) IN ('101', '102','100')喽,但是这样就有可能把前4位是1002的记录也带出来了,所以说不太可行哦. 
      

  7.   

    select a.*
    from tableName A ,(SELECT     DECODE (INSTR (:in_str, ',', 1, 1),
                                  0, :in_str,
                                  SUBSTR (:in_str,
                                          DECODE (ROWNUM,
                                                  1, 1,
                                                    INSTR (:in_str,
                                                           ',',
                                                           1,
                                                           ROWNUM - 1
                                                          )
                                                  + 1
                                                 ),
                                          DECODE (ROWNUM,
                                                  1, INSTR (:in_str, ',', 1, 1) - 1,
                                                    LENGTH (:in_str)
                                                  - LENGTH (REPLACE (:in_str,
                                                                     ',',
                                                                     ''
                                                                    )
                                                           )
                                                  + 1, LENGTH (:in_str),
                                                    INSTR (:in_str, ',', 1, ROWNUM)
                                                  - 1
                                                  - INSTR (:in_str,
                                                           ',',
                                                           1,
                                                           ROWNUM - 1
                                                          )
                                                 )
                                         )
                                 ) in_str
                     FROM DUAL
               CONNECT BY ROWNUM <=
                               LENGTH (:in_str)
                             - LENGTH (REPLACE (:in_str, ',', ''))
                             + 1) b
                             where instr(a.code,b.in_str,1)>0 你把这段SQL去试试
    其中的
    :in_str 用'101,102'代替,不用加%
      

  8.   


    我想hebo2005的意思是将所有的条件做成一个结果集,相当于一个子查询,然后将其和要查询的表进行关联。
    而在利用INSTR(A.code,结果集.XXX)> 0来过滤数据。
      

  9.   

    不过上面的这段有个缺点instr 相当于 like '%101%'
    和'101%'还有差别的
    或者用
    substr(a.code,1,length(b.in_str))=b.in_str
    这样就是开头匹配的
      

  10.   

    SQL还是不够强大啊.需求总是无止境的,哈哈
      

  11.   

    create or replace type str_tb is table of varchar2(32767)
    select A.* from 
    tableName A,
    (
    select column_value as CODE from table(str_tb('101','102'))
    ) B
    where A.CODE like B.CODE || '%'
      

  12.   

    建立一个临时表TABLE1 存放你的 LIKE 101% 102%的东东
    create table table1 
    as
    select a.code from tablename where acode like '101%' or A.code like '102%' ;
    然后通过IN 语句来实现
    select * from tablename a where a.code in (select to_char(a.code) from table1)
      

  13.   

    有点离题太远了,不能这么复杂的实现啊.太复杂的话就背离了我的本意了,那我还不如LIKE OR 了
      

  14.   

    如果规则不确定,like or是最简单的 ,不要舍进求远。
      

  15.   

    你可以把他写成一个函数啊,然后用动态SQL实现啊
    Execute Immediate ' select * from tableName A where ' || f_GetCondition(pi_sColName,pi_ConValue);
    在f_GetCondition 里面用循环来时条件的组装