首页 > 解决方案 > 创建函数 REGEX 进行优化

问题描述

我被要求优化我的查询速度。我目前在我的查询中有这个正则表达式,它正在检查一个模式并返回该模式内的子字符串。为了澄清,我有一个包含多个列的表,我必须查看它以检查该值:[v=并返回该列表中的数字。

这是通过几个'name..'看起来像这样的列:xyzzy [v=123]但我只想返回 123,以下工作:

COALESCE(REGEXP_SUBSTR(NAME, '[[]v=([0-9]+)', 1, 1, 'ie'),
REGEXP_SUBSTR(NAME_5, '[[]v=([0-9]+)', 1, 1, 'ie'), 
REGEXP_SUBSTR(NAME_4, '[[]v=([0-9]+)', 1, 1, 'ie')) as display_vertical_code

但为了优化这一点,我想可能会创建一个函数,不幸的是我不知道 javascript:/ 而且我不知道格式是否正确我在创建它时遇到了一些困难,这是我尝试过的,可以有人告诉我我是否遗漏了什么?

    CREATE OR REPLACE FUNCTION dfp.regex(NAME VARCHAR)
RETURNS OBJECT
LANGUAGE javascript 
STRICT AS '
return new RegExp(NAME,"[[]v=([0-9]+)",1 ,1,"ie")
';

当我尝试在以下查询中使用上述功能时:

    COALESCE(
        GET(DFP.REGEX(NAME)),
        GET(DFP.REGEX(NAME_5)),
        GET(DFP.REGEX(NAME_4)),
        GET(DFP.REGEX(NAME_3)),
        GET(DFP.REGEX(NAME_2)),
        GET(DFP.REGEX(NAME_1)),
        GET(DFP.REGEX(NAME_0))
) as display_vertical_code

我看到这个错误:

位置 8 处的错误第 3 行没有足够的参数用于函数 [GET(REGEX(Tablename.NAME))],预期为 2,得到 1

标签: javascriptsnowflake-cloud-data-platform

解决方案


这应该这样做。

CREATE OR REPLACE FUNCTION regex(NAME VARCHAR)
RETURNS string
LANGUAGE javascript 
STRICT IMMUTABLE AS
$$
    const regex = /[[]\s{0,5}v\s{0,5}=\s{0,5}([0-9]+)/i;
    let s = NAME.match(regex);
    if (s != null) {
        return s[0].split('=')[1].trim();
    } else {
        return null;
    }
$$;


select regex('xyzzy [v=123]');

-- Alternate permutation
select regex('xyzzy [ v = 123]');

你想返回一个字符串,而不是一个对象。添加 IMMUTABLE 选项会告诉 Snowflake,相同的输入每次都会产生相同的输出。它有时可以帮助提高性能。

编辑...这个更容错并允许空格(如果这可能是一个问题)。如果您想摆脱允许的空格,请删除\s{0,5}表达式。


推荐阅读