select *
  from frttcditm
 where frttcdsetid = 'B389'
   and instr(decode('[]', '00', ',00,01,02,', ',00,01,02,03,04,05,06,07,'),
             ',' || cditmid || ',') > 0

解决方案 »

  1.   

    --1表示yes 其他表示no
    select decode('1','1','yes','no') from dual; 
    select decode('0','1','yes','no') from dual; 
    --e的位置
    select instr('yes','e',1) from dual
      

  2.   

    谢谢,好不容易才看懂,instr什么意思。那俩函数一块啥意识呀!
      

  3.   

    cditmid 是frttcditm这个表的一个字段
      

  4.   

    oracle instr函数
    decode函数用来判断,类似if语句
      

  5.   

    百度  oracle instr,知道函数的作用是提取,decode的作用是条件选择,然后测试两三个语句就明白了
      

  6.   

    decode的用法:
    参数1是要判断的内容
    参数2是用来判断的条件值
    如果参数1等于参数2的值,那么decode返回值是参数3,否则返回值是参数4。
    decode可以通过嵌套来完成较复杂的判断,如:
    decode(x,1,男,decode(x,2,女,未知))instr的用法:
    在参数1字符串中查找参数2字符串,找到则返回所在的位置,没有找到就返回0.全手打,较复杂的用法就不写了,需要详细了解你可以去下百度。
      

  7.   

    a instr('b', 'c')是查看字符a是否在b c中的一个,不存在返回0
      

  8.   

    我怎么感觉你这个 sql 语句有点问题?
    decode('[]'......),你这个基本上只会返回 ',00,01,02,03,04,05,06,07,' 吧。。
      

  9.   

    我觉得你的 sql 语句逻辑是不是有点小问题?
    decode 判断的表达式是 '[]',那你只会返回 ',00,01,02,03,04,05,06,07,' 这个结果
      

  10.   

    select *
      from frttcditm
     where frttcdsetid = 'B389'
       and instr(decode('[]', '00', ',00,01,02,', ',00,01,02,03,04,05,06,07,'),
                 ',' || cditmid || ',') > 0
    为什么(',00,01,02,')00前要有个逗号,为什么要用||连接,cditmid 是字段名,值该是多少了
      

  11.   


    你最大的问题实际是不知道这个语句到底实现什么东西
    这个语句实际就是想看 cditmid 字段是不是 00 或者 01 等等的值
    之所以前后加一个逗号,是避免出现异常匹配,例如 07 可以匹配上 0 和 7 两个值,但是实际你要的是匹配上 07 这样的字符串,所以前后加一个不可能出现的逗号(这个符号任意,想用啥用啥)拼接一下
    所以找的就是 ',07,' 和 ',07,' 匹配
      

  12.   

    opps_zhou
    谢谢!
    现在看出点门道了
    我的需求是前后有两个下拉框,前面的选00了,后面就只能选(比如)00,01,03,。下拉框的所有值是00-07,也就是cditmid 这个字段的值,人家给我写的,我看不懂
      

  13.   

    严格来说,我没有看懂你的指令有什么用途;
    我们可以把它拆分来理解:
    instr(decode('[]', '00', ',00,01,02,', ',00,01,02,03,04,05,06,07,'),
      ',' || cditmid || ',')
    这样写的目的是找出DECODE函数所返回的字符串是否存在',cditmid,'字符串;
    而“cditmid”应该是个字段,用'||'目的是将','与该字段关联起来在一起查找。
    上面的语句相当于:
    decode('[]', '00', ',00,01,02,', ',00,01,02,03,04,05,06,07,') like  '%,'||cditmid||',%'
    当然instr要比like性能好的多。以上是个人见解,希望对楼主有帮助
      

  14.   

    cditmid这个取得是表里的值吗,取得是几呀,他的只有00-07
    谢谢
      

  15.   

    恩 “cditmid”一定是取的表里面的字段,如果“frttcditm”是一张表的话,“cditmid”就是这张表里面的字段,如果是视图,那“cditmid”就是这个视图中的某个表里面的数据,楼主建议你认真看看别人的东西。
      

  16.   

    select instr(',00,01,02,','00') from dual
    这样我能看懂
    看00在不在',00,01,02,'这里
    但现在是字段,字段的值是几呀,能不能把字段给个值给我说一下
    麻烦你了
      

  17.   

    我的需求是前后有两个下拉框,前面的选00了,后面就只能选(比如)00,01,03,。下拉框的所有值是00-07,也就是cditmid 这个字段的值
      

  18.   

    INSTR
    语法:
    INSTR ( string, substring [, position [, occurrence ] ] )
    用法:
    在string中,从position开始搜索substring,返回第occurrence次匹配的位置。如果没找到,返回0。position和occurrence的默认值是1。当position为负数时,表示从string的后面开始向前搜索。
    例子:
    SQL> SELECT INSTR('12345678901234567890', '0') result FROM DUAL;    RESULT
    ----------
            10SQL> SELECT INSTR('12345678901234567890', '0', 11) result
      2  FROM DUAL;    RESULT
    ----------
            20SQL> SELECT INSTR('12345678901234567890', '0', 2, 2) result
      2  FROM DUAL;    RESULT
    ----------
            20SQL> SELECT INSTR('12345678901234567890', '0', 11, 2) result
      2  FROM DUAL;    RESULT
    ----------
             0SQL> SELECT INSTR('12345678901234567890', '0', -1) result
      2  FROM DUAL;    RESULT
    ----------
            20SQL> SELECT INSTR('12345678901234567890', '0', -1, 2) result
      2  FROM DUAL;    RESULT
    ----------
            10
      

  19.   

    DECODE
    语法:
    DECODE ( expr, { search, result [, ...] } [, default] )
    用法:
    DECODE比较每个expr的值,如果expr等于其中一个search,那么返回相应的result。如果没有匹配的值,返回default。如果没有default,返回NULL。在DECODE中,Oracle认为两个NULL是匹配的,所以如果expr是NULL,就会返回第一个为NULL的search的相应的result。DECODE函数中,包括expr,search,result和default,一共可以有255个组件。
    参数:
    参数必须是数值或字符类型。
    例子:
    SQL> SELECT ENAME, DECODE(SIGN(SAL-4000),1,'RICH',0,'MIDDLE','LOW') result
      2  FROM SCOTT.EMP;ENAME      RESULT
    ---------- ------
    SMITH      LOW
    ALLEN      LOW
    WARD       LOW
    JONES      LOW
    MARTIN     LOW
    BLAKE      LOW
    CLARK      LOW
    SCOTT      LOW
    KING       RICH
    TURNER     LOW
    ADAMS      LOWENAME      RESULT
    ---------- ------
    JAMES      LOW
    FORD       LOW
    MILLER     LOW