1

为了为地址创建 PlaceKey 以链接我的一些表,我需要在 SnowFlake 中拆分一个地址列。

我不熟悉 JavaScript,但我在 SnowFlake 中尝试了 Javascript UDF。然后我不知道如何处理像'123_45ThSt'这样的地址。

我的函数的输出就像'123_45 Th St'。我被困在这里。

预期输出为“123 45Th St”。希望有人可以帮助我。非常感激!

下面是另一个示例和我的 SnowFlake SQL 代码:

 Original address column: 12345NE17ThSt

 The expected column:     12345 NE 17Th St

 My function's output:    12345 NE17 ST

我的功能:

CREATE OR REPLACE FUNCTION Split_On_Upper_Case(s string)
 RETURNS string
 LANGUAGE JAVASCRIPT 
 AS '
 function Split_On_Upper_Case(str){
 str=str.split(/(?=[A-Z])/).join(" ")
 return str
 }

 // Now call the function
 return Split_On_Upper_Case(S);
 '
 ;
4

1 回答 1

1

假设街道地址的格式包括数字+单词(以小写或数字结尾)+单词(以大写开头),我有以下解决方案:

CREATE OR REPLACE FUNCTION Split_On_Upper_Case(s string)
RETURNS string
LANGUAGE JAVASCRIPT 
AS $$
  regexp = /([0-9]+)(NE|SE|NW|SW)?(.*[0-9a-z]{1})([A-Z][a-zA-Z0-9]+)/g;
  splits = regexp.exec(S.replace(/_/g, " "));
  if (splits && splits.length == 5) {
     return 
        splits[1].trim() + " " + 
        (splits[2] ? splits[2].trim() + " ": "" ) + 
        splits[3].trim() + " " + 
        splits[4].trim();
  }
  
  return "not found" // or whatever you want to do
$$;

然后尝试运行该函数:

select Split_On_Upper_Case('12345NE17ThSt');
-- 12345 NE 17Th St

select Split_On_Upper_Case('123_45ThSt');
-- 123 45Th St

select Split_On_Upper_Case('35TestSt');
-- 35 Test St

它返回预期的输出,但如果您有更多的样本输入,它们可以帮助验证。

于 2021-10-01T04:48:37.447 回答