You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Snowflake SQL结合JavaScript实现多正则规则循环数据清洗方案咨询

问题说明

我现有如下查询语句:

Select 
 COLUMN as RAW_COLUMN
,REGEX_REPLACE(COLUMN,'REGEX_PATTERN_HERE','REPLACEMENT_STRING_HERE') as CLEAN_COLUMN
FROM TABLE

如上所示,我已创建了基于JavaScript的REGEX_REPLACE自定义函数,支持通过正则模式替换列值,函数定义如下:

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函数直到所有规则应用完成。

// 规则格式:regex_pattern_dict={'匹配模式':'替换内容'}
regex_pattern_dict ={
     '[0-9]{2}[\/\.][0-9]{2}':''                 // 移除日期格式如 "08/02"
    ,'[0-9]{3}[-][0-9]{3}[-][0-9]{4}':''         // 移除手机号格式如 "888-957-4675"
    ,'[+][0-9]{11}': ''                          // 移除手机号格式如 "+18882467822"
};

换言之,我希望在SQL查询内部使用JavaScript的REGEX_REPLACE函数与上述字典实现循环逻辑,期望实现效果如下:

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
$$
// 正则清洗规则字典
const regex_pattern_dict ={
    "[0-9]{2}[\/\.][0-9]{2}":""                 // 移除日期格式如 "08/02"
    ,"[0-9]{3}[-][0-9]{3}[-][0-9]{4}":""         // 移除手机号格式如 "888-957-4675"
    ,"[+][0-9]{11}": ""                          // 移除手机号格式如 "+18882467822"
};
// 待清洗的字段名
var RegexStr = "COLUMN";
// 遍历规则拼接嵌套替换逻辑,Key为正则匹配模式,Value为替换字符串
for (const [key, value] of Object.entries(regex_pattern_dict)) {
   RegexStr = "REGEX_REPLACE(" + 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

内容的提问来源于stack exchange,提问作者mikelowry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 09:54:00