javascript - 创建函数 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
解决方案
这应该这样做。
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}
表达式。
推荐阅读
- android - FirebaseMessagingService 创建后立即销毁
- php - Laravel 似乎没有连接控制器方法
- java - Hibernate updateable=false 如果它不为空
- plsql - 我正在尝试将时区 UTC 转换为 asia/calcutta 它显示错误 ORA-01849 小时必须在 1 到 12 之间
- android - 有没有办法以编程方式清除所有缓存文件?
- android - 动态功能模块中的 Resources$NotFoundException - Android
- javascript - 重新加载页面后自动单击按钮
- laravel - 在 vuejs 中下载链接 excel
- kubernetes - 从配置到某个命名空间的 env 文件创建秘密
- amazon-web-services - 如何找出 AWS 安全组阻止了哪些 IP 地址?