从遵循模糊模式 SQL Netezza 的字符串中提取序列

Posted

技术标签:

【中文标题】从遵循模糊模式 SQL Netezza 的字符串中提取序列【英文标题】:extract serial from string that follow fuzzy pattern SQL Netezza 【发布时间】:2021-01-23 00:21:47 【问题描述】:

请给我一条日志消息,其中包含一个带有难以理解的模糊模式的序列,如下所示

|LogMsg                                                                                    |
|------------------------------------------------------------------------------------------|
|Customer Receive CPE Indoor. serial 21530369847SKA011094, user:ahmed.o.haraz              |
|Customer Receive CPE Indoor as change. serial :21530369847SK9078291, user:Abdullah.M160275|
|Customer Receive CPE Indoor. serial:ZTERRT1H9202990                                       |
|Customer Receive CPE Indoor. serial 21530369847SKB333996 .UserName :TEDST.mohamed.badry   |
|Customer Receive CPE Indoor as change. serial :21530373727skc298302, user:Frass.m195577   |
|Customer Receive CPE Indoor. serial 21530369847SKA267112 .UserName :seller.160002         |

我需要像下面这样从字符串中提取序列号

|Serial|
|21530369847SKA011094|
|21530369847SK9078291|
|ZTERRT1H9202990     |
|21530369847SKB333996|
|21530373727skc298302|
|21530369847SKA267112|

我使用regexp_replace() 得到了上述查询,但它错过了其中一些

select replace(replace(regexp_extract(logmsg, 'serial [^,]+'), 'serial ', ''), ':', '')

【问题讨论】:

您最好在应用程序级别解决这个问题。您可以将逻辑封装在 LogMsgParser 类或其他东西中。如果没有,请声明一个 SQL 函数来处理解析。顺便说一句,那个日志编写器非常可怕。它不能记录结构化消息吗? 【参考方案1】:

试试

select get_value_varchar(
        regexp_extract_all_sp(logmsg,
          '(serial\s*:?)([^,\s]+)'),3) as serial
from serial;

它应该会给你想要的结果

        SERIAL
----------------------
 21530369847SKA011094
 21530369847SKA267112
 21530369847SKB333996
 21530369847SK9078291
 ZTERRT1H9202990
 21530373727skc298302
(6 rows)

【讨论】:

非常感谢 Aniket,它工作得很好,如果有推荐的来源可以了解更多信息:regexp_replace() 和 regexp_extract_all_sp() 可以参考ibm.com/support/knowledgecenter/en/SS5FPD_1.0.0/com.ibm.ips.doc/…

以上是关于从遵循模糊模式 SQL Netezza 的字符串中提取序列的主要内容,如果未能解决你的问题,请参考以下文章

Netezza - 从 SQL 语句中获取已删除记录的计数

Netezza 从 SQL Server 加载表

我可以从 Netezza 导出 SQL 查询结果吗?

从 Visual Studio 2008 调用 netezza 查询'执行 SQL 任务

Netezza - 从 SQL 的角度来看,啥是托管?

用于从连续记录中收集值的 Netezza SQL