【问题标题】:Snowflake : REGEXP replace with uppercase of capture group雪花:REGEXP 替换为捕获组的大写
【发布时间】: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') 不会将其转换为大写。

【问题讨论】:

    标签: sql regex snowflake-cloud-data-platform regexp-replace


    【解决方案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',','));
    

    【讨论】:

      猜你喜欢
      • 2017-10-13
      • 2022-01-01
      • 2015-02-09
      • 2022-11-29
      • 1970-01-01
      • 2017-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多