Oracle SQL:使用 REGEXP_SUBSTR 表达式的插入查询非常长(分割字符串)

2023-12-06

我必须插入表 2 字段(第一个主键(关于文章),第二个涉及它们的大小(这些文章)。

在源环境中,我有表、主键(TK 文章)和第二个字段的大小串联。但是,我必须将 TK 文章和文章的几种大小插入到目标表中。 例如,

来源:

ART        SIZE**                                      
1        |  28/30   
2        |  30/32   
3        | Size 10/Size 12/Size 14/Size 14

Target:

ART         Size
1        |   28  
1        |   30                   
2        |   30            
2        |   32             
3        |  Size 10         
3        |  Size 12       
3        |  Size 14      
3        |  Size 16

困难在于知道该字段中包含了多少个“/”?

我已查询

SELECT ART,
       REGEXP_SUBSTR(SIZE,'[^/]+',1,level)
FROM TABLLE
CONNECT BY REGEXP_SUBSTR(SIZE,'[^/]+',1,level) IS NOT NULL;

选择的交易将在 46 秒内生效并显示结果。但是 TABLE 有 100 000 行,插入事务太长并且不起作用。

有人可以在这一点上帮助我吗?

感谢和问候


正则表达式的计算成本非常高。如果需要处理大量行,我个人会使用存储过程 - 管道表函数:

-- table with 100000 rows
create table Tb_SplitStr(col1, col2) as
  select level
       , 'Size 10/Size 12/Size 14/Size 14/Size 15/Size 16/Size 17'
   from dual
  connect by level <= 100000 
  1. PL/SQL 包:

    create or replace package Split_Pkg as
      type T_StrList is table of varchar2(1000);
      function Str_Split(
         p_str in varchar2,
         p_dlm in varchar2
      ) return T_StrList pipelined;
    end;
    
    create or replace package body Split_Pkg as
      function Str_Split(
         p_str in varchar2,
         p_dlm in varchar2
      ) return T_StrList pipelined
      is
         l_src_str  varchar2(1000) default p_str;
         l_dlm_pos  number;
      begin
         while l_src_str is not null
         loop
            l_dlm_pos := instr(l_src_str, p_dlm);
            case
              when l_dlm_pos = 0
              then pipe row (l_src_str);
                   l_src_str := '';
              else pipe row(substr(l_src_str, 1, l_dlm_pos - 1));
                   l_src_str := substr(l_src_str, l_dlm_pos + 1);
            end case;
         end loop;
         return;
      end; 
    end;
    
  2. 使用正则表达式函数进行 SQL 查询:

    with ocrs(ocr) as(
       select level
         from ( select max(regexp_count(col2, '[^/]+')) as mx
                  from tb_splitStr) t
       connect by level <= t.mx
    )
    select count(regexp_substr(s.col2, '[^/]+', 1, o.ocr)) as res
      from tb_splitStr s
       cross join ocrs o
    

Result:

-- SQL with regexp
SQL> with ocrs(ocr) as(
  2    select level
  3     from ( select max(regexp_count(col2, '[^/]+')) as mx
  4              from tb_splitStr) t
  5    connect by level <= t.mx
  6  )
  7  select count(regexp_substr(s.col2, '[^/]+', 1, o.ocr)) as res
  8    from tb_splitStr s
  9     cross join ocrs o
 10  ;

Res
------------------------------
                        700000
Executed in 4.093 seconds

SQL> /

Res
------------------------------
                        700000
Executed in 3.812 seconds



--Query with pipelined table function  
SQL> select count(*)
  2    from Tb_SplitStr s
  3    cross join table(split_pkg.Str_Split(s.col2, '/'))
  4  ;

 COUNT(*)
----------
    700000
Executed in 2.469 seconds

SQL> /

COUNT(*)
----------
    700000
Executed in 2.406 seconds
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Oracle SQL:使用 REGEXP_SUBSTR 表达式的插入查询非常长(分割字符串) 的相关文章

  • Vba访问错误91

    我尝试运行这段代码 Public Sub Production UpdateStatus ByVal lngProductionId As Long ByVal NewProductionStatus As eProductionStatu
  • 获取表中两组不同行的计数,然后将它们分开

    我对 MySQL 很陌生 我正在尝试提出一个基本上可以执行以下操作的查询 select from tasks where completed 1 除以 select from tasks where completed 0 我已经找到了解决
  • 更新或删除的行值要么不会使该行唯一,要么会更改多行

    我想删除行 但收到 此错误 更新或删除的行值不会使该行唯一 或者 他们改变多行 您的表中有重复的行 在这种情况下 您无法使用 UI 编辑表 首先使用 SQL 删除具有匹配数据的行 然后尝试进行编辑 逐一删除具有匹配数据的行 直到只剩下一行
  • 将结果行强制转换为对象

    有没有办法将调用存储过程获得的结果行强制转换为特定对象 以便我可以仅将该对象的列表传递到视图中 我知道我可以使用 Node list 之类的东西来做到这一点 但我最终将用一个相当复杂的存储过程替换 getnodes 该存储过程创建临时表并执
  • H2数据库,通过从CSVREAD选择结果插入

    我有一个 CSV 文件 例如 1 hello 13 2 world 14 3 ciao 26 我正在尝试使用CSVREAD函数将该文件读入数据库 如下所示 insert into my table id message code value
  • 正则表达式匹配不在数组中的逗号(用方括号括起来)

    我有一个对象 想将其表示为带有一些附加格式的字符串 这是我的代码 stringify object and remove double quotations let outPut JSON stringify myObject replac
  • Oracle:SQL 选择带时间戳的日期

    我有以下数据 SQL gt select from booking session BK ID BK DATE 1 18 MAR 12 10 00 00 000000 2 18 MAR 12 10 25 00 000000 3 18 MAR
  • 父元素的递归串联

    我有一个看起来像这样的表 ID Name Parent 1 A NULL 2 B NULL 3 C 1 4 D 1 5 E 3 6 F 5 我想要一个视图返回这个 ID Name ParentNames 1 A 2 B 3 C A 4 D
  • 使用正则表达式从字符串中提取日期和时间

    我正在开发一个正则表达式 它接受所有可能的日期和时间格式 以从句子中提取它们 这是我的正则表达式 31 0 13578 1 02 Jan Mar May Jul Aug Oct Dec 1 1 30 0 1 3 9 1 0 2 Jan Ma
  • 如何解析这个 OFX 文件?

    这是原始 ofx 文件 因为它来自 m 银行 不用担心 没有什么敏感信息 我剪掉了所有交易的中间部分 开放金融交易所 OFX 是一个 用于交换的数据流格式 演变的财务信息 来自微软的开放金融 连接 OFC 和 Intuit 的 Open 交
  • postgres union 是否保证调用有副作用的函数时的执行顺序?

    我正在使用 postgres 9 3 并尝试确保从 sql 语句调用时按顺序调用存储过程 以下操作是否有效 确保首先调用 foo 然后调用 bar select null void from select 1 from foo union
  • sql 查询不适用于 order by

    这是我原来有效的查询 Select FROM story st sentences s speaker sp WHERE st lesson id 1 AND st speaker id sp speaker id AND st sente
  • 如何对表中的每一行运行特定的sql查询?

    所以我的数据库中有两个表 它们看起来都是这样的 通讯 拨打电话 Timestamp FromIDNumber ToIDNumber GeneralLocation 2012 03 02 09 02 30 878 674 Grasslands
  • 如何将H2数据库文件存储到项目目录中

    当我使用H2数据库时 数据库文件存储在C Users MyName TestDataBase db目录 H2路径是jdbc h2 TestDataBase 这是默认的 H2 数据库路径 是否有可能像这样将 H2 数据库文件存储到我的项目目录
  • C# 中的多个 SQL 查询将变量作为列返回

    我正在开展一个创建注册系统的学校项目 我选择的数据库方法是使用 T SQL 因为它是我已经熟悉的东西 我正在使用下面的代码来查询数据库 public void button3 Click object sender EventArgs e
  • 选择 PostgreSQL 中的临时表? [复制]

    这个问题在这里已经有答案了 如何在 PostgreSQL 中使用 select into 创建临时表 例如在 SQL 中Select into temp tab from source tab 您可以尝试使用创建表为 http www po
  • 当我传递 NULL 值时,COALESCE 函数不起作用,但当将变量声明为 NULL 时它起作用

    当我执行以下查询时 我得到输出 但是当我通过NULL参数 它不起作用 示例1 DECLARE a int NULL b int NULL c int NULL SELECT COALESCE a b c GO 输出 空 示例2 SELECT
  • 如何从单行创建多行 - 规范化表

    我对 SQL 很陌生 并试图弄清楚这一点 我有一个名为 BUDGET 的表 其中包含一年中每个月的 12 列 显示该月的预算余额 所以表格看起来像这样 Department Year Month1 Month2 Month12 ABCD 2
  • Ruby 将不可打印的字符转换为数字

    我有一个包含不可打印字符的字符串 我目前正在做的是将它们替换为波浪号 使用 string gsub print 但是 我实际上想将它们转换为整数值 我尝试了这个 但它总是输出0 string gsub print 1 to i 想法 字符串
  • 我怎样才能从表中获得第一个免费ID

    我有一个带有主键字段 ID 的表 我不想使用身份 因为我需要为用户提供手动为新对象选择 ID 的可能性 所以我的想法是 默认情况下 在编辑视图中 ID 字段将为 0 如果用户不更改它 我需要找到第一个免费ID并使用它 如果用户更改 ID 我

随机推荐

  • 如何在 sqlite4java 中禁用自动提交?

    我最近一直在使用 sqlite4java 库 我想我已经弄清楚了 唯一困扰我的是我不知道如何使用这个库关闭自动提交 有人可以帮忙吗 代码示例将不胜感激 提前致谢 博罗 Jefromi 和 king nak 是正确的 您只需要发出开始和结束事
  • 如何在 R 中将值放在箱线图中,以表示一张图像中的多个箱线图

    我想在 R 中绘制 Delta Project Types 我有 10 个项目类型 我知道如何绘制箱线图 箱线图 Delta Project Types 但是 如何将 Fivenum 最小值 最大值 第一 第二和第三分位数 放在每个箱线图上
  • 在 Rails 应用程序中使用适用于多个模型的设备

    你好 我是 Rails 新手 我已经安装了 Rails 版本 4 我想知道我正在为老师和学生制作项目 我可以将设计宝石应用到模型老师和学生身上吗 我的项目中最重要的是教师和学生的注册表单需要不同 那么谁能告诉我如何应用设计以便可以以不同的方
  • 如何在seaborn中显示所有数字图例值

    我正在尝试创建一个sns lineplot 对于以下数据框 overs season over total runs total overs avg run 0 2008 1 703 745 0 943624 1 2008 2 923 74
  • 仅在新iPad 3上:wait_fences:未能收到回复:10004003

    所以我知道对此有很多问题 但据我所知这是一个独特的情况 所以我想我会发布它 希望这会添加一些信息 最终可以给我们一个答案 解释为什么会发生这种情况 当我的设备旋转时 我收到错误 wait fences 无法接收回复 10004003 我的动
  • Android 通讯录 vcard API

    有没有 Android API 可以提取 vcard 3 0 格式的联系人 我遇到了一个开源 vcard 项目android vcard 但在使用示例提到了以下评论 重要的 如果您正在为 Android 设备开发应用程序 则不必使用此库 因
  • 如何将 TestExecute/TestComplete 结果导出到 teamcity?

    我正在 teamcity 中使用命令行构建步骤通过批处理文件运行 testcomplete 测试 测试运行良好 但我没有看到有关 teamcity 中通过 失败测试的任何信息 基本上 TestComplete 在运行测试后会生成一些日志文件
  • 如何在 Discord.js 嵌入中 ping 消息作者和用户

    我最近开始使用 Discord js 目前正在执行拥抱命令 命令本身工作正常 但我面临的问题是我希望机器人 ping 消息作者和被拥抱的用户 如果我输入命令 a hug user 这就是我得到的 拥抱用户名 但我希望它像这样显示 user拥
  • 在 Spring 中的嵌入式 Jetty 上配置 Spring Security

    我有一个 Spring beans 定义文件 如下所示
  • 使用VBA操作网页上的单选按钮

    我是一名 VBA 菜鸟 尝试在网络上操作单选按钮 但运气不佳 我已经在谷歌上搜索了几个小时 发现了大量的代码片段 我一直试图修改它们来完成这项工作 但没有成功 其中必须是以下内容的一些变体 ie Document getElementsBy
  • PHP 可以处理作为完整 PDF 文档提交的 PDF 表单吗

    简而言之 我有一个 PDF 供客户填写 当他们按下 提交 按钮时 我想自动发送一封电子邮件 并附上完整的 PDF 这应该发生在服务器端 无需与客户进行进一步交互 In Long 目前我已将 PDF 设置为将数据作为 html 表单数据发布到
  • 如何重置 Oracle 中的序列?

    In PostgreSQL 我可以这样做 ALTER SEQUENCE serial RESTART WITH 0 Oracle 有类似的吗 这是 Oracle 大师提供的一个将任何序列重置为 0 的好过程Tom Kyte 下面的链接也对利
  • 未定义对“WinMain@16”的引用 C 错误

    我正在使用 Eclipse C 编程 并且已经编写了这段代码 但每次构建它时 我都会收到错误消息 对 WinMain 16 的未定义引用 我花了两个多小时试图解决这个问题 但我不知道我的错误在哪里 有人可以帮忙吗 这是代码 include
  • 按列将分隔文件拆分为较小的文件

    我熟悉linux中的split命令 如果我有一个 100 行长的文件 split l 5 myfile txt 将把 myfile txt 分成 20 个文件 每个文件有 5 行 并将它们写入文件 我的问题是 我想按列执行此操作 给定一个包
  • 使用 AJAX 发送文件数组

    假设我有一个包含一些图像的数组 var images image1 image2 image3 如何在单个请求中使用 AJAX 将这些图像发送到 php 文件 以下代码不起作用 ajax url PHP posts php type pos
  • 在运行时设置 ConnectionString

    我是 C 编程的初学者 我需要编辑 设置 更改我存储在我的连接字符串app config 我正在使用 VS 数据库向导来创建查询 如果你能写出代码那就太好了 像这样的事情应该让你开始 using System Configuration v
  • 设置为“通知”时正在裁剪大图片

    我想在 Android 通知栏中显示大图片样式图像 但我遇到了问题 gt 当我使用以下代码在通知栏中设置图像时 PendingIntent resultPendingIntent stackBuilder getPendingIntent
  • 使用外部 smtp 服务器发送电子邮件时达到 Amazon EC2 邮件限制

    Hi我使用 grails MailSender 服务 使用下面的 Java Mail API 从 Amazon EC2 Linux 实例发送大量电子邮件 我已将邮件 API 配置为使用端口 25 上的外部 smtp 服务器来发送电子邮件 并
  • 向动态收件人发送电子邮件 SSIS 发送邮件任务

    我有一个 SSIS 包 将在测试 登台和最终生产中部署 它有几个 发送邮件任务 比如 10 个 作为开发人员 我将我的电子邮件地址作为电子邮件的收件人 目前 对于测试人员 我需要将所有脚本任务中的所有 To 更改为例如 电子邮件受保护 如果
  • Oracle SQL:使用 REGEXP_SUBSTR 表达式的插入查询非常长(分割字符串)

    我必须插入表 2 字段 第一个主键 关于文章 第二个涉及它们的大小 这些文章 在源环境中 我有表 主键 TK 文章 和第二个字段的大小串联 但是 我必须将 TK 文章和文章的几种大小插入到目标表中 例如 来源 ART SIZE 1 28 3