【问题标题】:Proper Case in Big QueryBig Query 中的正确案例
【发布时间】:2018-07-15 20:20:34
【问题描述】:

我在 Big Query 的“香蕉”列中有“我想买香蕉”这句话。

我想得到“我想买香蕉”。我该怎么做?当我看到 LOWER 和 UPPER 时,我期待 PROPER(Bananas) 函数,但似乎不支持 PROPER 大小写?

DZ

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

    2020 年 10 月更新:

    BigQuery 现在支持 INITCAP 函数 - 该函数接受一个 STRING 并将其返回,其中每个单词的第一个字符为大写,所有其他字符为小写。非字母字符保持不变。

    因此,不再需要以下类型的花哨 UDF - 而您只需使用

    #standradSQL
    SELECT str, INITCAP(str) proper_str
    FROM `project.dataset.table`
    

    --~~~~~~~~~~~~~~~~~~

    以下示例适用于 BigQuery Standrad SQL

    #standradSQL
    CREATE TEMP FUNCTION PROPER(str STRING) AS (( 
      SELECT STRING_AGG(CONCAT(UPPER(SUBSTR(w,1,1)), LOWER(SUBSTR(w,2))), ' ' ORDER BY pos) 
      FROM UNNEST(SPLIT(str, ' ')) w WITH OFFSET pos
    ));
    WITH `project.dataset.table` AS (
      SELECT 'i Want to buy bananas' str
    )
    SELECT str, PROPER(str) proper_str
    FROM `project.dataset.table`  
    

    结果是

    Row str                     proper_str   
    1   i Want to buy bananas   I Want To Buy Bananas    
    

    【讨论】:

      【解决方案2】:

      我扩展了 Mikhail Berlyant 的答案,在连字符 (-) 之后也大写,因为我需要为地名使用正确的大小写。必须从 SPLIT 函数切换到使用正则表达式来执行此操作。

      我在开始时测试一个空字符串并返回一个空字符串(而不是 null)以匹配本机 UPPER 和 LOWER 函数的行为。

      CREATE TEMP FUNCTION PROPER(str STRING) AS (( 
        SELECT 
          IF(str = '', '',
            STRING_AGG(
              CONCAT(
                UPPER(SUBSTR(single_words,1,1)), 
                LOWER(SUBSTR(single_words,2))
              ), 
              '' ORDER BY position
            )
          )
        FROM UNNEST(REGEXP_EXTRACT_ALL(str, r' +|-+|.[^ -]*')) AS single_words
        WITH OFFSET AS position
      ));
      
      WITH test_table AS (
        SELECT 'i Want to buy bananas' AS str
        UNION ALL
        SELECT 'neWCASTle upon-tyne' AS str
      )
      
      SELECT str, PROPER(str) AS proper_str
      FROM test_table 
      

      输出

      Row str                     proper_str   
      1   i Want to buy bananas   I Want To Buy Bananas  
      2   neWCASTle upon-tyne     Newcastle Upon-Tyne
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-04-03
        • 1970-01-01
        • 1970-01-01
        • 2019-06-18
        • 2021-09-09
        • 2018-02-21
        • 1970-01-01
        相关资源
        最近更新 更多