雪花:REGEXP 替换为捕获组的大写

Posted

技术标签:

【中文标题】雪花:REGEXP 替换为捕获组的大写【英文标题】:Snowflake : REGEXP replace with uppercase of capture group 【发布时间】:2021-12-01 21:42:13 【问题描述】:

我想在雪花数据库中用大写的逗号(,)替换第一个字母。下面给出的是我尝试过的,但是没有用。

例如:

Apple,ball,cat --> Apple,Ball,Cat
Bulb,LED,tube --> Bulb,LED,Tube
SELECT  REGEXP_REPLACE('Apple,ball,cat',',(\\\w)',UPPER('\\\1'));

,(\\\w) 捕获逗号后的字母,但UPPER('\\\1') 不会将其转换为大写。

【问题讨论】:

【参考方案1】:

我不确定你是否可以在 REGEXP_REPLACE 中使用函数。

请使用内置的INITCAP功能

SELECT INITCAP('Apple,ball,cat', ',');

参考:INITCAP

或者可能是这样的:

SELECT LISTAGG(UPPER(LEFT(VALUE, 1)) || SUBSTRING(VALUE, 2, LEN(VALUE)), ',')
  FROM TABLE(SPLIT_TO_TABLE('Apple,ball,cat', ',')) as t(val);

【讨论】:

谢谢,但我需要除逗号后的第一个字母以外的所有字母保持原样。 INITCAP 使它们全部小写。 我在回答中添加了另一种可能性,我知道这不是一个漂亮的解决方案,但它确实有效。 打败我吧,迈克尔(+1 btw)!【参考方案2】:

不是“正则表达式”,但如果您对 javascript UDF 感兴趣,可以满足您的需求...

CREATE OR REPLACE FUNCTION fx_replaceInitOnly(
    input varchar)
returns varchar
language javascript
as '
  //logic from https://www.freecodecamp.org/news/how-to-capitalize-words-in-javascript/
  var words = INPUT.split(",");

  for (let i = 0; i < words.length; i++) 
      words[i] = words[i][0].toUpperCase() + words[i].substr(1);
  

  output = words.join(",");
  return output;
';

SELECT 
  'Apple,ball,cat,Bulb,LED,Tube' as str, 
  fx_replaceInitOnly(str) as new,
  case WHEN str <> new THEN 'Changed' ELSE 'Same' END as test;

--STR                           NEW                           TEST
--Apple,ball,cat,Bulb,LED,Tube  Apple,Ball,Cat,Bulb,LED,Tube  Changed

【讨论】:

感谢@Michael Golos 的编辑!【参考方案3】:

正则表达式不会帮助你提高你的字符,所以你可以结合 split_to_table 和 initcap:

SELECT LISTAGG( INITCAP(VALUE) ,','  )
FROM TABLE(SPLIT_TO_TABLE('Apple,ball,cat',','));

【讨论】:

以上是关于雪花:REGEXP 替换为捕获组的大写的主要内容,如果未能解决你的问题,请参考以下文章

REGEXP_REPLACE 字符串以雪花中的特定子字符串开头和结尾

如何使用 regexp_replace 仅替换捕获组而不是完整匹配字符串

MatchData 中捕获的组的即时或隐式类型转换

REGEXP_REPLACE 捕获组

Regexp_replace 仅返回大写字符(忽略空格)

REGEXP_REPLACE 用相同的小写文本替换文本