【问题标题】:UpperCase Replace(Split_Part())大写替换(Split_Part())
【发布时间】:2021-07-18 01:12:06
【问题描述】:

社区, 我需要帮助删除 UNDER SCORES '_' 并使名称可读,名字字母大写姓氏大写,同时删除数字。希望这是有道理的。我正在运行 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

【问题讨论】:

    标签: sql presto trino


    【解决方案1】:

    试试这个:

    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])。

    【讨论】:

    • @martin - 效果很好,谢谢。感谢您的解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-27
    • 2013-10-15
    • 2014-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-24
    相关资源
    最近更新 更多