select *
from frttcditm
where frttcdsetid = 'B389'
and instr(decode('[]', '00', ',00,01,02,', ',00,01,02,03,04,05,06,07,'),
',' || cditmid || ',') > 0
from frttcditm
where frttcdsetid = 'B389'
and instr(decode('[]', '00', ',00,01,02,', ',00,01,02,03,04,05,06,07,'),
',' || cditmid || ',') > 0
解决方案 »
- 如何查询包里面的函数被哪些对象调用
- sql语句在存储过程中实现的问题!!
- 关于SGA中的数据高速缓存?
- 创建索引,和具体的sql语句该怎么结合在一起?
- 创建对象类型出错
- 启动OEM,如何“登录到Oracle Management Server"?
- 如何在oracle8.0.4中获取用户的ip地址?
- 讨论:怎样把ORACLE DBMS由/user1移到/user2上?
- 求大神解答!Oracle_12c中没有scott用户,运行了RDBMS\ADMIN里的scott.sql脚本之后好像没效果啊
- orcale单行子查询返回多行
- oracle 连接字符串的问题(本人小白)
- 如何对两表指定字段值部分相同进行筛选?
select decode('1','1','yes','no') from dual;
select decode('0','1','yes','no') from dual;
--e的位置
select instr('yes','e',1) from dual
decode函数用来判断,类似if语句
参数1是要判断的内容
参数2是用来判断的条件值
如果参数1等于参数2的值,那么decode返回值是参数3,否则返回值是参数4。
decode可以通过嵌套来完成较复杂的判断,如:
decode(x,1,男,decode(x,2,女,未知))instr的用法:
在参数1字符串中查找参数2字符串,找到则返回所在的位置,没有找到就返回0.全手打,较复杂的用法就不写了,需要详细了解你可以去下百度。
decode('[]'......),你这个基本上只会返回 ',00,01,02,03,04,05,06,07,' 吧。。
decode 判断的表达式是 '[]',那你只会返回 ',00,01,02,03,04,05,06,07,' 这个结果
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 是字段名,值该是多少了
你最大的问题实际是不知道这个语句到底实现什么东西
这个语句实际就是想看 cditmid 字段是不是 00 或者 01 等等的值
之所以前后加一个逗号,是避免出现异常匹配,例如 07 可以匹配上 0 和 7 两个值,但是实际你要的是匹配上 07 这样的字符串,所以前后加一个不可能出现的逗号(这个符号任意,想用啥用啥)拼接一下
所以找的就是 ',07,' 和 ',07,' 匹配
谢谢!
现在看出点门道了
我的需求是前后有两个下拉框,前面的选00了,后面就只能选(比如)00,01,03,。下拉框的所有值是00-07,也就是cditmid 这个字段的值,人家给我写的,我看不懂
我们可以把它拆分来理解:
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性能好的多。以上是个人见解,希望对楼主有帮助
谢谢
这样我能看懂
看00在不在',00,01,02,'这里
但现在是字段,字段的值是几呀,能不能把字段给个值给我说一下
麻烦你了
语法:
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
语法:
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