javascript - 雪花 SQL + Javascript 可能吗?
问题描述
假设我有以下查询:
Select
COLUMN as RAW_COLUMN
,REGEX_REPLACE(COLUMN,'REGEX_PATTERN_HERE','REPLACEMENT_STRING_HERE') as CLEAN_COLUMN
FROM TABLE
正如您在上面看到的,我创建了一个 Javascript 函数,它允许我使用正则表达式模式替换列值。下面是函数:
CREATE OR REPLACE FUNCTION "REGEX_REPLACE"("SUBJECT" VARCHAR(16777216), "PATTERN" VARCHAR(16777216), "REPLACEMENT" VARCHAR(16777216))
RETURNS VARCHAR(16777216)
LANGUAGE JAVASCRIPT
AS '
const p = SUBJECT;
let regex = new RegExp(PATTERN, ''i'')
return p.replace(regex, REPLACEMENT);
';
我需要用几个正则表达式替换来清理数据。我要做的是创建一个字典,该字典将保存正则表达式模式和替换字符串,这些字符串将用于循环并执行该regex_replace()
函数。换句话说,在 SQL 查询本身中一遍又一遍地运行 函数REGEX_REPLACE()
,直到它遍历整个字典。
//Key:value rule for regex_pattern_dict={'THE PATTERN HERE':'WHAT YOU WANT TO REPLACE IT WITH'}
regex_pattern_dict ={
'[0-9]{2}[\/\.][0-9]{2}':'' -- remove dates i.e. "08/02"
,'[0-9]{3}[-][0-9]{3}[-][0-9]{4}':'' -- remove phone numbers i.e. "888-957-4675"
,'[+][0-9]{11}': '' -- remove phone numbers i.e. "+18882467822"
};
换句话说,在 SQL 查询本身中,我试图用 JavascriptREGEX_REPLACE
函数和字典创建一个循环(字典也在 javascript 中)。
我想我想做的是这样的:
Select
COLUMN as RAW_COLUMN
--,REGEX_REPLACE(COLUMN,'REGEX_PATTERN_HERE','REPLACEMENT_STRING_HERE') as CLEAN_COLUMN
,for (const [PATTERN, REPLACEMENT] of Object.entries(regex_pattern_dict)) {
REGEX_REPLACE(COLUMN,PATTERN,REPLACEMENT);
} AS CLEAN_COLUMN
FROM TABLE
任何想法如何解决这个问题?不知道如何在 SQL 中放置一个 javascript 循环。
在@David Garrison 的帮助下,以下代码是解决方案:
CREATE or replace PROCEDURE TABLE_CLEAN()
RETURNS VARCHAR
LANGUAGE javascript
AS
$$
//Regex Cleaning Dictionary
const regex_pattern_dict ={
"[0-9]{2}[\/\.][0-9]{2}":"" // remove dates i.e. "08/02"
,"[0-9]{3}[-][0-9]{3}[-][0-9]{4}":"" // remove phone numbers i.e. "888-957-4675"
,"[+][0-9]{11}": "" // remove phone numbers i.e. "+18882467822"
};
//Column to Clean
var RegexStr = "COLUMN";
//Key = Regex Pattern, Value = Replacement
for (const [key, value] of Object.entries(regex_pattern_dict)) {
RegexStr = "REXP_REPLACE_ME(" + RegexStr + ",'" + key + "','" + value + "')"
}
var rs = snowflake.execute( { sqlText:
`
CREATE OR REPLACE VIEW DATABASE.SCHEMA.TABLE AS
SELECT
COLUMN
, ${RegexStr} as clean_column
FROM DATABASE.SCHEMA.TABLE_ORIGINAL
`
} );
$$;
call TABLE_CLEAN();
select * from DATABASE.SCHEMA.TABLE
解决方案
更新了更正确的语法。完整的解决方案在已编辑的问题中
var RegexStr = "COLUMN";
for (const [key, value] of Object.entries(regex_pattern_dict)) {
RegexStr = "REXP_REPLACE(" + RegexStr + ",'" + key + "','" + value + "')"
}
sql = `select
raw_column,
` + RegexStr + `as clean_column
from table`
sql_statement = snowflake.createStatement({sqlText: sql });
result_set = sql_statement.execute();
注意:这可能需要使用过程而不是函数。
推荐阅读
- opengl - 无法让纹理在 Common Lisp 中的 OpenGL 中工作
- tensorflow - 如何提高对相似对象的图像分类的准确性并降低过拟合
- r - R:在图上叠加集群
- reactjs - Redux reducer:当数组没有对象数据时将对象添加到数组
- node.js - .find 不是sails js mongodb中的函数
- python - 保存以十进制计的棒球局
- c++ - 如何在使用 C++ 显示文本文件中的文本时有条件
- javascript - 在js中从两个单独的给定日期添加新对象
- javascript - 无法在颤动的 web 视图中打开 tel、mailto、whatsapp 链接?
- python - 搜索游戏文件并增加替换 pid#