• instr模糊查询使用及注意事项


    对应参数描述: 
    instr('源字符串' , '目标字符串' ,'开始位置','第几次出现'),返回目标字符串在源字符串中的位置。后面两个参数可要可不要。
     

    ​instr('源字符串' , '目标字符串' ), 从开头开始查找第一个‘ 目标字符串 ’出现的位置 

    1.结尾,网上有说这么写的,但是在orcle下没有问题,在mysql中是有问题的。
    查询最后一个
    SELECT * FROM 用户.表 WHERE INSTR(字段名, ‘杰 ’) = LENGTH(字段名)
    SELECT * FROM 用户.表 WHERE 字段名 LIKE '%杰 ‘;
     
    查询最后两个
    SELECT * FROM 用户.表 WHERE INSTR(字段名, ‘邱天’) = LENGTH(字段名)-1
    SELECT * FROM 用户.表 WHERE 字段名 LIKE '%邱天‘;
    上面两个是相等的,不过第一个效率高 。

    实际执行结果:
    SELECT * 
    FROM d_ebc_member 
    WHERE 
    INSTR(member_name,'杰') = (LENGTH(member_name));
     

    换个SQl执行: 
     
    SELECT * 
    FROM d_ebc_member 
    WHERE 
    INSTR(member_name,'杰') = (LENGTH(member_name)-6);
     

    按这个查询在mysql里面是有问题的: 
    第一:LENGTH()函数在mysql中取字节,因此每个汉子字要按三个字节计算。 
    第二:instr取的是位置。 
    SELECT * FROM 用户.表 WHERE INSTR(字段名, ‘杰’,-1,1) = LENGTH(字段名) 
    我觉得前半部分需要加上位置参数,才是表示从倒数第一个位置开始,第一次出现的位置, 
    加上后报错如下: 
    incorrect parameter count in the call to native function 'instr' 
    这是由于mysql和Orcle的不同造成的。
     
    结论:
    末尾查询使用使用like或者其他,用instr无法实现末尾查询
     
    2.包含
    SELECT * 
    FROM d_ebc_member 
    WHERE 
    INSTR(member_name,'杰') > 0; 
     
    SELECT * FROM 用户.表 WHERE 字段名 LIKE '%杰 %‘;
     
    3.开头
    SELECT * 
    FROM d_ebc_member 
    WHERE 
    INSTR(member_name,'周') = 1; 
     
    SELECT * FROM 用户.表 WHERE 字段名 LIKE ‘周 %’;

    4.not like
    SELECT * 
    FROM d_ebc_member 
    WHERE 
    INSTR(member_name,'周') = 0; 

    SELECT * FROM 用户.表 WHERE 字段名 not LIKE ‘%周%’;
     
    SELECT * 
    FROM d_ebc_member 
    WHERE 
    member_name 
    NOT LIKE
    '%周%'
  • 相关阅读:
    6-1
    4-9
    4-5
    4-4
    4-3
    3-10
    作业三2
    作业三1
    课堂练习二
    实验三
  • 原文地址:https://www.cnblogs.com/erma0-007/p/12124106.html
Copyright © 2020-2023  润新知