大写替换(Split_Part())

UpperCase Replace(Split_Part())

社区, 我需要帮助删除下划线“_”并使名称可读名字字母大写姓氏大写,同时删除数字。希望这是有道理的。我是 运行 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 函数将它们与 space 连接在一起。

更新:

这是另一个不涉及 transform 和中间数组的变体:

regexp_replace(
    replace(regexp_extract(email, '(^[^0-9@]+)', 1), '_', ' '),
    '(\w)(\w*)',
    x -> upper(x[1]) || lower(x[2]))

和上面的方法一样,它首先提取非数字前缀,然后用replace函数用spaces替换下划线,最后,它使用regexp_replace来处理每个单词。 (\w)(\w*) 正则表达式将单词的第一个字母和单词的其余部分捕获到两个单独的捕获组中。 x -> upper(x[1]) || lower(x[2]) lambda 表达式然后将第一个字母大写(第一个捕获组 -- x[1])并将其余字母小写(第二个捕获组 -- x[2])。