regexp_replace 在 Azure SQL DW 中

regexp_replace in Azure SQL DW

在 Azure SQL DW 中是否有替代 REGEXP_REPLACE 的内置函数,就像在 Oracle / 或任何其他关系数据库中一样?

我需要从 URL 中删除 GUID 值和任何字母数字值。下面给出的例子。有什么办法可以在 azure SQLDW 中轻松实现吗?如果不在 SQL DW 中,那么至少在 Azure SQLDB 中?

输入

/my-account/premises/001A4BF58F8C1EE1ACE8ED6A65698305/accounts/overview

/my-account/001A4BF5891C1ED1A5F27409BC0A1D02/accounts/851008500240-1602-1512164572/tariff

/my-account/premises/001A4BF5891C1EE1A0B1190619534001/accounts/85-0000286922

/my-account/premises/001A4BF5891C1ED1A5F2C3BD506D0E07/accounts/overview

Output_expected

/my-account/premises/accounts/overview

/my-account/accounts/tariff

/my-account/premises//帐户/

/my-account/premises/accounts/overview

Azure SQL 数据仓库不支持正则表达式。

你可以做的是使用来自 U-SQL 的 federated query,即在 U-SQL 脚本中从你的仓库获取数据,使用 RegEx 转换它然后输出为一个平面文件。使用 Polybase 将该平面文件导入您的数据仓库。 U-SQL ADLA还没有直接写入SQL DW的能力。

示例脚本:

USING rx = System.Text.RegularExpressions.Regex;

/*!!TODO do federated query to Azure SQL Data Warehouse here instead
@input =
    SELECT *
    FROM EXTERNAL MyAzureSQLDWDataSource LOCATION "dbo.yourTable";
*/ 
@input = SELECT *
        FROM (
        VALUES
            ( "/my-account/premises/001A4BF58F8C1EE1ACE8ED6A65698305/accounts/overview" ),
            ( "/my-account/001A4BF5891C1ED1A5F27409BC0A1D02/accounts/851008500240-1602-1512164572/tariff" ),
            ( "/my-account/premises/001A4BF5891C1EE1A0B1190619534001/accounts/85-0000286922" ),
            ( "/my-account/premises/001A4BF5891C1ED1A5F2C3BD506D0E07/accounts/overview" )
        ) AS t( yourPath );


@output =
    SELECT rx.Replace(yourPath, @"/([0-9]|[A-F]|-){13,32}", "") AS cleanPath
    FROM @input;


OUTPUT @output
TO "/output/output.csv"
USING Outputters.Csv(quoting : false);

我的结果:

阅读有关联合查询的更多信息here. RegEx put together with help from https://regex101.com/