转载:这里写链接内容
1:当字段!=NULL
在Oracle/PLSQL中,instr函数返回要截取的字符串在源字符串中的位置。只检索一次,就是说从字符的开始到字符的结尾就结束
SELECT code, name, dept, occupation FROM staff WHERE instr(code, '001') > 0;
等同于
SELECT code, name, dept, occupation FROM staff WHERE code LIKE '%001%' ;
2: 判断字段 ==null or ’ ‘
一个decode的SQL语句老是筛不出想要的数据,应该是判断的字段包括了NULL,instr无法对其行使正常的查找。Oracle中的instr,在被查找的字符串中找得到要查找的字符串,就返回其所在的位置数值,找不到就返回0,而如果被查找的字符串是NULL,就返回不了任何东西。
因此要对NULL先行处理,使用nvl,将NULL转换成其它数据,但是不能转换成空字符串(如nvl(data,”),否则instr还是用不了,虽然空字符串已经是字符型,但它没有长度(不信用length试试),其中上Oracle把它默认为NULL,虽然它实际上不能算NULL,可是用instr去搜索字符串,得到的还是空,不是0,也不是其它数值,还是不能发挥查找的功能。所以只能用nvl把NULL处理成一个空格,nvl(data,’ ‘),这样才能正常使用instr。”和’ ‘是不一样的,虽然都是字符型,但后者有一个空格在单引号里,就不是空值,它的长度就是1。
SELECT
o.ORDER_SEQ orderSeq,v.VIN vin, o.ORDER_STATUS,instr(nvl(o.MISC,' '), getJobNumber('3534963010'))
FROM
ORDER_INFO o
INNER JOIN
VEHICLE_INFO v
ON
o.VIN=v.VIN
LEFT JOIN
STAFF_INFO s
ON
o.JOB_NUMBER != s.JOB_NUMBER AND instr(nvl(o.MISC,' '), getJobNumber('3534963010')) = 0
where TO_CHAR(SYSDATE , 'YYYYMMDDHH24MI') > o.PLAN_PICKUPTIME
--AND o.REAL_PICKUPTIME IS NOT NULL
ps: