首页 > 解决方案 > 雪花 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




标签: javascriptsqlsnowflake-cloud-data-platform

解决方案


更新了更正确的语法。完整的解决方案在已编辑的问题中

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();

注意:这可能需要使用过程而不是函数。


推荐阅读