雪花: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 字符串以雪花中的特定子字符串开头和结尾