Current data and regex used

请考虑以下数据;

FDTYP/TESTTYPE/FDPERIOD/31 Day(s)/MAT_INST/CREDIT_TO_ACC/DEPTACCT/0016/

当前用于分隔数据的方式是使用分隔符‘/’来获取此数据列表;

{"FDTYP", "TESTTYPE", "FDPERIOD", "31 Day(s)", "MAT_INST", "CREDIT_TO_ACC", "DEPTACCT", "0016" }

这是使用正则表达式的代码片段;

REGEXP_SUBSTR( ORGDATA ,'(.*?)/|$', 1, COLUMN_VALUE, NULL, 1 ) AS DATALABEL


The problem

现在考虑一下这些数据

FDTYP/FD2323*/*/*-/FDPERIOD/31 Day(s)/MAT_INST/CREDIT_TO_ACC/DEPTACCT/0016/

第二个数据包含分隔符‘/’,它生成以下数据列表

{"FDTYP", "FD2323*", "*", "*-", "FDPERIOD", "31 Day(s)", "MAT_INST", "CREDIT_TO_ACC", "DEPTACCT", "0016" }

正确的数据应该在什么时候

{"FDTYP", "FD2323*/*/*-", "FDPERIOD", "31 Day(s)", "MAT_INST", "CREDIT_TO_ACC", "DEPTACCT", "0016" }

现在,我知道解决这个问题的最简单方法是更改使用的分隔符,但不幸的是,由于遗留数据的原因,这是不可能的.

那么,有没有办法创建一个忽略第二个数据分隔符的正则表达式呢?

我已经try 了以下正则表达式

(?<=FDTYP\/)(.*?)(?=\/FDPERIOD)

它确实为我获得了第二个数据,但对其余数据不起作用.

推荐答案

我不是FDTYPE/%清楚您使用的是哪个版本的SQL,或者您实际上是如何获取该JSON的,但假设问题始终发生在FDTYPE//FDPERIOD之间,我认为应该可以这样做:

  1. 只将子字符串中的/个实例替换为您知道不会出现在数据集中的某个字符或字符组合.在我的示例中,我使用{!}作为替代.

  2. 你的日常生活正常吗?

  3. 返回提取的数据,并将您的替换{!}转换回/.

SELECT
    'FDTYP/FD2323*/*/*-/FDPERIOD/31 Day(s)/MAT_INST/CREDIT_TO_ACC/DEPTACCT/0016/' AS ORGDATA,
    CONCAT('FDTYP/', REPLACE(REGEXP_SUBSTR((SELECT ORGDATA), '(?<=FDTYP/)(.*)(?=/FDPERIOD)'), '/', '{!}'), REGEXP_SUBSTR((SELECT ORGDATA), '/FDPERIOD.*(?=/$)')) AS transformed,
    CONCAT('{"', REPLACE((SELECT transformed), '/', '", "'), '"}') AS object_str,
    REPLACE((SELECT object_str), '{!}', '/') AS untransformed

这给你带来了:

FDTYP/FD2323*/*/*-/FDPERIOD/31 Day(s)/MAT_INST/CREDIT_TO_ACC/DEPTACCT/0016/
FDTYP/FD2323*{!}*{!}*-/FDPERIOD/31 Day(s)/MAT_INST/CREDIT_TO_ACC/DEPTACCT/0016
{"FDTYP", "FD2323*{!}*{!}*-", "FDPERIOD", "31 Day(s)", "MAT_INST", "CREDIT_TO_ACC", "DEPTACCT", "0016"}
{"FDTYP", "FD2323*/*/*-", "FDPERIOD", "31 Day(s)", "MAT_INST", "CREDIT_TO_ACC", "DEPTACCT", "0016"}

https://www.db-fiddle.com/f/4BRg1FG23qhYYFrwFAqqEY/0

Sql相关问答推荐

SQL查询以条件空值跟踪生产操作结果进展

Oracle SQL-将结果列在单行中

如何使用WSO2将空值传递给我的SQL Server存储过程?

从日期开始向前填充重复项

基于多列比较连接两个表

每年独特口味的冰淇淋数量

正在编写查询.我需要将订阅的时间段分为第一个订阅中包含的另一个订阅之前和之后的时间段

如何用客户名称计算sum(dr)和sum(cr)

根据是否出现过零来筛选数据(跨多行)

此过程如何在不引用传递的参数值的情况下执行工作?

将伪数据插入Postgres表

从重复值中获取最新值

根据日期 Select ID 的上一条记录

Athena 计算从日期到当前时间戳的每月计数

验证某个日期前后的连续代码

编写查询以根据级别 (p2) 返回父位置

SQL Select 最大并获取列名

在给定列中具有特定值的行与 SQL 中的总行数的比率

SQL 中的问题与包含最大日期的记录连接

在 SQL 中将行显示为列