首页 > 数据库 >Oracle INSTR和LIKE转换注意事项

Oracle INSTR和LIKE转换注意事项

时间:2024-08-01 08:57:07浏览次数:10  
标签:instr 00 LIKE NO INSTR Oracle null name

 

Oracle INSTR和LIKE转换注意事项

 

A式:INSTR(A.G_NO || ',', B.G_NO || ',') >= 1 和 B式:INSTR(A.G_NO , B.G_NO) >= 1 等价吗
不等价,
1、B.G_NO有空值的情况,
假设A.G_NO也为空值,则A式为','和','比较是成立的,即空值和空值是符合的,而B式则不符合
假设A.G_NO='XXXX',则A式为'XXXX,'和','比较也是成立的,B式则不符合

14:40:12 SYS@test(36)> select instr(null,null) r1,instr(null||',',null||',') r2,instr('XXXX'||',',null||',') r3 from dual;

        R1         R2         R3
---------- ---------- ----------
                    1          5

Elapsed: 00:00:00.00

 

2、假设 A.G_NO='2,3,4,5,112'
B.G_NO='1'
A式左边=0,不成立,B式左边=9,成立

14:25:56 SYS@test(36)> select instr('2,3,4,5,112,','1,') A,instr('2,3,4,5,112','1') B from dual;

         A          B
---------- ----------
         0          9

Elapsed: 00:00:00.00

也许可能存在其他情况。


A式:INSTR(A.G_NO || ',', B.G_NO || ',') >= 1 和 B式:A.G_NO LIKE '%' || B.G_NO || '%' 等价吗
不等价,同理,
B.G_NO有空值的情况,
假设A.G_NO也为空值,那么A式=INSTR(',',','),B式=null like '%%',明显不等价
假设A.G_NO='XXXX',那么A式=INSTR('XXXX,',','),B式='XXXX' like '%%'


那么INSTR(A.G_NO || ',', B.G_NO || ',') >= 1和 A.G_NO LIKE '%' || B.G_NO || '%' AND B.G_NO IS NOT NULL 等价吗
也不等价,和上边例子的第二个举例一样。

只能将INSTR(A.G_NO || ',', B.G_NO || ',') >= 1改为: A.G_NO || ',' LIKE '%' || B.G_NO || ',%' AND B.G_NO IS NOT NULL。

 

什么,你问我instr有必要改为like吗?

现有一毛一样的测试表两个,如下:

15:11:56 ZKM@test(75)> select name,count(*) from a group by name;   15:12:05 ZKM@test(75)> select name,count(*) from b group by name;
                                                                      
NAME                        COUNT(*)                                  NAME                        COUNT(*)
------------------------- ----------                                  ------------------------- ----------
                               10896                                                                 10896
abcd                               2                                  abcd                               2
abc                                6                                  abc                                6
                                                                      
Elapsed: 00:00:00.25                                                  Elapsed: 00:00:00.39

https://www.cnblogs.com/PiscesCanon/p/18335898

测试比对的SQL和执行情况如下:

select count(*) from a,b where a.id=b.id and instr(a.name,b.name,1,1)>=1;

Plan hash value: 1397777030

-----------------------------------------------------------------------------------------------------------------
| Id  | Operation           | Name | Starts | E-Rows | A-Rows |   A-Time   | Buffers |  OMem |  1Mem | Used-Mem |
-----------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |      |      1 |        |      1 |00:00:08.13 |      38 |       |       |          |
|   1 |  SORT AGGREGATE     |      |      1 |      1 |      1 |00:00:08.13 |      38 |       |       |          |
|*  2 |   HASH JOIN         |      |      1 |   5944K|     52 |00:00:08.13 |      38 |  2168K|  2168K| 1411K (0)|
|   3 |    TABLE ACCESS FULL| A    |      1 |  10904 |  10904 |00:00:00.01 |      19 |       |       |          |
|   4 |    TABLE ACCESS FULL| B    |      1 |  10904 |  10904 |00:00:00.01 |      19 |       |       |          |
-----------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("A"."ID"="B"."ID")
       filter(INSTR("A"."NAME","B"."NAME",1,1)>=1)


select count(*) from a,b where a.id=b.id and a.name like b.name || '%' and a.name is not null and b.name is not null;

-----------------------------------------------------------------------------------------------------------------
| Id  | Operation           | Name | Starts | E-Rows | A-Rows |   A-Time   | Buffers |  OMem |  1Mem | Used-Mem |
-----------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |      |      1 |        |      1 |00:00:00.01 |      38 |       |       |          |
|   1 |  SORT AGGREGATE     |      |      1 |      1 |      1 |00:00:00.01 |      38 |       |       |          |
|*  2 |   HASH JOIN         |      |      1 |     32 |     52 |00:00:00.01 |      38 |  1888K|  1888K|  621K (0)|
|*  3 |    TABLE ACCESS FULL| A    |      1 |      8 |      8 |00:00:00.01 |      19 |       |       |          |
|*  4 |    TABLE ACCESS FULL| B    |      1 |      8 |      8 |00:00:00.01 |      19 |       |       |          |
-----------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("A"."ID"="B"."ID")
       filter("A"."NAME" LIKE "B"."NAME"||'%')
   3 - filter("A"."NAME" IS NOT NULL)
   4 - filter("B"."NAME" IS NOT NULL)

 

在HASH JOIN的前提下,在这里instr的速度要远低于like的速度,原因是参与HASH JOIN步骤的A表和B表的数据量不同,可以对比两个执行计划Id=3,4的'A-Rows‘就看出来了。

回来instr有必要改为like的问题来,也可以不改,不过如果存在涉及字段存在null值得情况最好加上is not null限制(虽然这里本身instr已经限制了null值),估计大多数人会忽略这个情况吧。

当然,如果是NL的情况,结果也同样类似。

至此。防。

标签:instr,00,LIKE,NO,INSTR,Oracle,null,name
From: https://www.cnblogs.com/PiscesCanon/p/18335898

相关文章

  • Oracle VM VirtualBox创建虚拟机相关问题
    这次直接使用virtualbox来进行虚拟机的创建和运行。在控制项里新建一台虚拟电脑,然后就是正常的选择虚拟镜像以及设置账户密码。我正常的就给虚拟机分配4G内存,处理器4CPU,然后磁盘空间分配个16G,当然后续都是可以进行调整的。之后就是系统的安装时间了,一段不算短的等待过后,终于出现......
  • Oracle知识整合----SQL概述
    目录一、SQL简介二、SQL语言的分类1、数据查询语言(DQL)2、数据操作/操纵(DML)3、数据定义语言(DDL)4、数据控制语言(DCL)5、事物控制语言(TCL)三、数据查询语言1、查询全部2、查询指定列3、在system下查询Scott的dept表,登录的用户的权限要比被查的用户的权限大4......
  • Oracle数据库自动备份
    1.bat脚本格式为ANSI格式setCURDATE=%date:~0,4%%date:~5,2%%date:~8,2%setCURMON=%date:~0,4%%date:~5,2%setCURTIME=%time:~0,2%if"%CURTIME%"=="0"setCURTIME=00if"%CURTIME%"=="1"setCURTIME=01if"%CURTIME%&q......
  • oracle-DBCA删除数据库
    DBCADBCA是Oracle软件包中用来安装/卸载/配置数据库的一个工具,其提供了两种方式对数据库进行安装或卸载,分别是GUI界面和静默模式。图形化安装的方式相对来说比较简单,容易上手,但是不具备重复利用性。每次重新安装数据库的时候都可能需要进行相同的配置,而这无疑会消耗工作者的......
  • 亲测有效!!![INS-32025] 所选安装与指定 Oracle 主目录中已安装的软件冲突。
    找到安装包下“\stage\cvu\cvu_prereq.xml”,复制一份,然后,打开这个xml,删除<CERTIFIED_SYSTEMS></CERTIFIED_SYSTEMS>之间的全部内容。原文件代码:<SPACE> <LOCVAR="CRS_HOME"SIZE="3.59"UNIT="GB"SEVERITY="IGNORABLE"......
  • oracle产品周期
              JDBC下载链接:https://www.oracle.com/database/technologies/appdev/jdbc-downloads.html......
  • 生成MySQL-oracle-SQL server数据字典(附Python代码)
    生成数据字典,早年写的,请注意新的版本变化。(1)MySQL元数据SQLUSEinformation_schema;#取出库和表。select  TABLE_SCHEMAAS'数据库名称',  TABLE_NAMEAS'表名',  TABLE_TYPEAS'表类型',  ROW_FORMATAS'行格式',  ENGINEAS'数据库引擎',  TABL......
  • Oracle知识整合----Oracle基础
    目录一、Oracle基础1、Oracle:甲骨文公司,其核心产品是Oracle数据库2、Oracle的安装目录:3、orcl目录4、DBF与数据库的关系5、唯一标识(SID)6、Oracle的表空间7、Oracle中的用户:(1)system:(2)sys:(3)hr:示例用户(4)scott:示例用户8、数据库版本:9、Oracle服务:10、......
  • 在Centos7中使用一键脚本安装Oracle11g
    在Centos7中使用一键脚本安装Oracle11g1.环境准备1.1系统版本:Centos7.9(2009)1.2Oracle版本:Oracle11g11.2.0.41.3网络需求:可以连接互联网1.4一键安装:curl-ooracle_install.shhttps://files-cdn.cnblogs.com/files/blogs/827077/oracle_install.sh?t=1722301473&&c......
  • Oracle内置SQL函数
    Oracle内置SQL函数F.1字符函数——返回字符值这些函数全都接收的是字符族类型的参数(CHR除外)并且返回字符值.除了特别说明的之外,这些函数大部分返回VARCHAR2类型的数值.字符函数的返回类型所受的限制和基本数据库类型所受的限制是相同的,比如:VARCHAR2数值被限制为2000字符(O......