SQL:使用Regex返回列中指定字符串的多个子字符串

发布于 2025-01-28 08:54:52 字数 1716 浏览 2 评论 0原文

I am querying metadata on Snowflake which contains a column of queries:

select query_name
from metadata
query_name
SELECT * FROM SYSIBM.SQLCOLUMNS
SELECT * FROM SYSIBM.SYSDUMMY1
SELECT CCID, CCCODE FROM V820.ZCC ZCC JOIN V820.ZCI ZCI ON ZCC.CCID = ZCI.CCID WHERE trim (cccode)不在('89090','89089','89087'中)
从v820.iim iim左JOIN v820.iime从iim.im.im.iprod = iime.improd左JOIN上选择 * *,cccode,cccode,cccde,ccdesc,ccdesc from V820。 zcc)zcc on iim.cccode = zcc.cccode left join join(选择v820.iic的iclas,iCdes)as iim.iclas = iic.iclas上的iic,

我想在query_name列中获取所有表引用。 输出应该看起来如下:

query_name
sysibm.sqlcolumms
sysibm.sysdummy1
v820.zcc v820.zci v820.iim
v820.iime v820.iime v820.zcc v820.iic v820.iic

编辑:我已经更新了我认为使用常规表达式的潜在解决方案:

with data as 
    (select parentid,
    query_name 
    FROM
        metadata),
    froms as
    (select any_value(data.parentid) parentid, listagg(regexp_substr(value, '\.[^\.]+\.'), '   ') dependencies
    from data, table(split_to_table(upper(query_name), 'FROM '))
    where index>1
    group by seq)
    SELECT * FROM froms
依赖
项系统。
sysibm。
v820。 v820。
v820。 v820。

但是我没有正确的正则语法。如何调整我的正则态度以在周期之前和之后获得所有内容?

I am querying metadata on Snowflake which contains a column of queries:

select query_name
from metadata
query_name
SELECT * FROM SYSIBM.SQLCOLUMNS
SELECT * FROM SYSIBM.SYSDUMMY1
SELECT CCID, CCCODE FROM V820.ZCC ZCC JOIN V820.ZCI ZCI ON ZCC.CCID = ZCI.CCID WHERE trim(CCCODE) NOT IN ('89090','89089','89087')
SELECT * FROM V820.IIM IIM LEFT JOIN V820.IIME AS IIME ON IIM.IPROD = IIME.IMPROD LEFT JOIN (SELECT CCCODE, CCDESC FROM V820.ZCC) ZCC ON IIM.CCCODE = ZCC.CCCODE LEFT JOIN (SELECT ICLAS, ICDES FROM V820.IIC) AS IIC ON IIM.ICLAS = IIC.ICLAS

I want to grab ALL table references in the query_name column.
The output should look like the following:

query_name
SYSIBM.SQLCOLUMNS
SYSIBM.SYSDUMMY1
V820.ZCC V820.ZCI
V820.IIM V820.IIME V820.ZCC V820.IIC

Edit: I've updated what I think is a potential solution using regular expressions:

with data as 
    (select parentid,
    query_name 
    FROM
        metadata),
    froms as
    (select any_value(data.parentid) parentid, listagg(regexp_substr(value, '\.[^\.]+\.'), '   ') dependencies
    from data, table(split_to_table(upper(query_name), 'FROM '))
    where index>1
    group by seq)
    SELECT * FROM froms
dependencies
SYSIBM.
SYSIBM.
V820. V820.
V820. V820.

But I don't have the correct RegEx syntax. How can I adjust my RegEx to get everything before and after the periods?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

能否归途做我良人 2025-02-04 08:54:52

尝试此查询:

Select 
SUBSTRING(query_name,CHARINDEX('from ', lower(query_name)) + 5,CHARINDEX(' ', lower(query_name + ' '), CHARINDEX('from ', lower(query_name)) + 5) - CHARINDEX('from ', lower(query_name)) - 5) query_name
from infotech.log_analytics.metadata;

Try this query:

Select 
SUBSTRING(query_name,CHARINDEX('from ', lower(query_name)) + 5,CHARINDEX(' ', lower(query_name + ' '), CHARINDEX('from ', lower(query_name)) + 5) - CHARINDEX('from ', lower(query_name)) - 5) query_name
from infotech.log_analytics.metadata;

DBFiddle Demo Link

∞琼窗梦回ˉ 2025-02-04 08:54:52

如果您的名称共享空间字符(例如[示例表]),这也不适用于涉及多个表的查询。
无论如何,遵循您的误解,您想在“从”和第一个空间之间获取单词(请注意之后留下的空间)。这是一种可能的方法。我使用一个对子查询的查询:

子查询:在这里,我们从您的桌子上获得“从”:

SELECT 
        SUBSTRING(  
                    query_name, 
                    CHARINDEX('FROM ', UPPER(query_name)) + 1, 
                    ABS(LEN(query_name) - CHARINDEX('FROM ', UPPER(query_name)))
                ) AS AUXILIARFIELD
     FROM 
        infotech.log_analytics.metadata
    
    

一旦我们获得此内容(应该返回以下内容):

sysibm.sqlcolumns

sysibm.sysysdummy1
v820.zcc zcc join v820.zci zci on zcc.ccid = zci.ccid where trim(cccode)不在('89090','89089','89089','89087','89087')

v820.iim

下一第一个位置有一个空间字符的开始,这很容易(请注意,Aux子查询是上面解释的):

SELECT  
      SUBSTRING(AUXILIARFIELD, 
                1, 
                IIF(CHARINDEX(' ', AUXILIARFIELD) = 0, 
                     LEN(AUXILIARFIELD), 
                     CHARINDEX(' ', AUXILIARFIELD))) AS EXPECTEDRESULT
FROM (
        SELECT 
                SUBSTRING(  
                            query_name, 
                            CHARINDEX('FROM ', UPPER(query_name)) + 5, 
                            ABS(LEN(query_name) - CHARINDEX('FROM ', UPPER(query_name)))
                        ) AS AUXILIARFIELD
             FROM 
                Table1
) AS AUXILIARQUERY
    

请查看它,并考虑到我可能错过了索引例外情况,如果没有空间表名之后。我只是在另一个表上检查了它,然后使用了您的表格和字段名称。

小提琴

This wouldnt work with queries involving more than one table, neither if you have tables whose names cointains space character ([Example table], for example).
Anyway, following your asumptions, you want to get the words between the 'FROM ' and the first space after that (please notice space left after from). Here is one possible approach. I use a query against a subquery:

Subquery: here we get the text after 'FROM ' from your table:

SELECT 
        SUBSTRING(  
                    query_name, 
                    CHARINDEX('FROM ', UPPER(query_name)) + 1, 
                    ABS(LEN(query_name) - CHARINDEX('FROM ', UPPER(query_name)))
                ) AS AUXILIARFIELD
     FROM 
        infotech.log_analytics.metadata
    
    

Once we have this (should return the following):

SYSIBM.SQLCOLUMNS

SYSIBM.SYSDUMMY1
V820.ZCC ZCC JOIN V820.ZCI ZCI ON ZCC.CCID = ZCI.CCID WHERE trim(CCCODE) NOT IN ('89090','89089','89087')

V820.IIM

what you need next is to get the text from the start to the first position where there is an space character, this is easier (please notice the AUX subquery is the one explained above):

SELECT  
      SUBSTRING(AUXILIARFIELD, 
                1, 
                IIF(CHARINDEX(' ', AUXILIARFIELD) = 0, 
                     LEN(AUXILIARFIELD), 
                     CHARINDEX(' ', AUXILIARFIELD))) AS EXPECTEDRESULT
FROM (
        SELECT 
                SUBSTRING(  
                            query_name, 
                            CHARINDEX('FROM ', UPPER(query_name)) + 5, 
                            ABS(LEN(query_name) - CHARINDEX('FROM ', UPPER(query_name)))
                        ) AS AUXILIARFIELD
             FROM 
                Table1
) AS AUXILIARQUERY
    

Please have a look at it and take into account I may have missed index exception cases if no space is after the table name. I just checked it against a different table to try it and later used your table and field names.

Fiddle here.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文