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

Snowflake : REGEXP replace with uppercase of capture group

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

例如:

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

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

我不确定你是否可以在 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);

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

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

不是“正则表达式”,但如果您对 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