gpt4 book ai didi

sql - 在 Oracle 中返回正则表达式的所有匹配项

转载 作者:行者123 更新时间:2023-12-04 14:07:36 27 4
gpt4 key购买 nike

我有一个包含名为 COMMANDS 的 VARCHAR2 列的表。

此列中的数据是一堆难以阅读的 ZPL 代码,将发送到标签打印机,在 ZPL 中还有 {TABLE.COLUMN} 形式的几个 token 。

我想要一个在 COMMANDS 中找到的所有不同 {TABLE.COLUMN} 标记的漂亮列表。我编写了以下正则表达式来匹配 token 格式:

SELECT REGEXP_SUBSTR(COMMANDS,'\{\w+\.\w+\}') FROM MYTABLE;

正则表达式有效,但它只返回每行第一个匹配的标记。有没有办法为每一行返回所有正则表达式匹配?

我正在使用 Oracle 11GR2。

编辑 - 这是来自单行的一小部分数据样本 - 每行中有许多这样的行:
^FO360,065^AEN,25,10^FD{CUSTOMERS.CUST_NAME}^FS
^FO360,095^AAN,15,12^FD{CUSTOMERS.CUST_ADDR1}^FS

因此,如果这是表中唯一的一行,我想返回:
{CUSTOMERS.CUST_NAME}
{CUSTOMERS.CUST_ADDR1}

最佳答案

您提供了数据样本,说明这是单行,但已将其显示为两个不同的行。所以这个例子基于你的话。

 -- Sample of data from your question + extra row for the sake of demonstration
-- id column is added to distinguish the rows(I assume you have one)
with t1(id, col) as(
select 1, '^FO360,065^AEN,25,10^FD{CUSTOMERS1.CUST_NAME}^FS^FO360,095^AAN,15,12^FD{CUSTOMERS1.CUST_ADDR1}^FS' from dual union all
select 2, '^FO360,065^AEN,25,10^FD{CUSTOMERS2.CUST_NAME}^FS^FO360,095^AAN,15,12^FD{CUSTOMERS2.CUST_ADDR2}^FS' from dual
),
cnt(c) as(
select level
from (select max(regexp_count(col, '{\w+.\w+}')) as o_c
from t1
) z
connect by level <= z.o_c
)
select t1.id, listagg(regexp_substr(t1.col, '{\w+.\w+}', 1, cnt.c)) within group(order by t1.id) res
from t1
cross join cnt
group by t1.id

结果:
    ID   RES
---------------------------------------------------------
1 {CUSTOMERS1.CUST_ADDR1}{CUSTOMERS1.CUST_NAME}
2 {CUSTOMERS2.CUST_ADDR2}{CUSTOMERS2.CUST_NAME}

根据@a_horse_with_no_name comment对于这个问题,实际上,替换与模式不匹配的所有其他内容要简单得多。下面是一个例子:
 with t1(col) as(
select '^FO360,065^AEN,25,10^FD{CUSTOMERS.CUST_NAME}^FS^FO360,095^AAN,15,12^FD{CUSTOMERS.CUST_ADDR1}^FS' from dual
)
select regexp_replace(t1.col, '({\w+.\w+})|.', '\1') res
from t1

结果:
RES
-------------------------------------------
{CUSTOMERS.CUST_NAME}{CUSTOMERS.CUST_ADDR1}

关于sql - 在 Oracle 中返回正则表达式的所有匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14222927/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com