1.<>
select * from s_dic s where s.dic_type <> 'ordertype'
问题1: <>会自动过滤s.dic_type为空的订单
解决方法:
1)截取字符串:返回第一次ordertype出现的位置,找不到对应字符串返回为0,不过dic_type必须保证为非空,所以联合concat一起使用,instr(s.dic_type,'ordertype')= 0
拼接字符串concat(ordertype, 'woshuo')
select * from s_dic s where instr(concat(s.dic_type, 'woshuo'),'ordertype') = 0
2)nvl 函数
NVL函数的格式如下:NVL(expr1,expr2)
含义是:如果oracle第一个参数为空那么显示第二个参数的值,如果第一个参数的值不为空,则显示第一个参数本来的值。
例如:
SQL> select ename,NVL(comm, -1) from emp;
select * from s_dic s where nvl(s.dic_type, 'woshuo') <> 'ordertype'
3)trim 函数
去空格。此外还有ltrim、rtrim
https://www.cnblogs.com/lanzi/archive/2013/01/14/2859666.html
例如:select trim(to_char(id,'0000')) from t1
先用to_char补0再去掉空格。
2.exists和in的区别
in 是把外表和内表作hash join,而exists是对外表作loop,每次loop再对内表进行查询。这样的话,in适合内外表都很大的情况,exists适合外表结果集很小的情况。
-
not exists和not in的区别
1)对于not exists查询,内表存在空值对查询结果没有影响;对于not in查询,内表存在空值将导致最终的查询结果为空。
2)对于not exists查询,外表存在空值,存在空值的那条记录最终会输出;对于not in查询,外表存在空值,存在空值的那条记录,最终将被过滤,其他数据不受影响