社区,我需要帮助删除UNDER SCORES"_",并使名称的名字字母UpperCase姓氏UpperCase可读,同时删除数字。希望这是有道理的。我正在运行Presto并使用Query Fabric。我有更好的方法来写这个语法吗?
电子邮件地址
Full_Metal_Jacket@movie.com
TOP_GUN2@movie.email.com
所需结果
全金属护套
壮志凌云
颗粒工作分辨率:
,REPLACE(SPLIT_PART(T.EMAIL, '@', 1),'_',' ') Name
类似这样的东西:
,LOWER(REPLACE(UPPER(SPLIT_PART(T.EMAIL, '@', 1)),'_',' '))Name
试试这个:
WITH t(email) AS (
VALUES 'Full_Metal_Jacket@movie.com', 'TOP_GUN2@movie.email.com'
)
SELECT array_join(
transform(
split(regexp_extract(email, '(^[^0-9@]+)', 1), '_'),
part -> upper(substr(part, 1, 1)) || lower(substr(part, 2))),
' ')
FROM t;
工作原理:
- 通过
regexp_extract
使用正则表达式提取到@的非数字前缀 split
—_上的前缀以生成数组transform
通过将每个元素的第一个字母大写并将其余字母小写来表示数组- 最后,使用
array_join
函数将它们用一个空间连接在一起
更新:
这里有另一个不涉及transform
和中间阵列的变体:
regexp_replace(
replace(regexp_extract(email, '(^[^0-9@]+)', 1), '_', ' '),
'(w)(w*)',
x -> upper(x[1]) || lower(x[2]))
与上面的方法一样,它首先提取非数字前缀,然后使用replace
函数用空格替换下划线,最后使用regexp_replace
处理每个单词。(w)(w*)
正则表达式将单词的第一个字母和单词的其余部分捕获到两个单独的捕获组中。然后,x -> upper(x[1]) || lower(x[2])
lambda表达式将第一个字母大写(第一个捕获组-x[1]
(,并将其余字母小写(第二个捕获组x[2]
(。