Big Query 中的正确案例
Posted
技术标签:
【中文标题】Big Query 中的正确案例【英文标题】:Proper Case in Big Query 【发布时间】:2018-07-15 20:20:34 【问题描述】:我在 Big Query 的“香蕉”列中有“我想买香蕉”这句话。
我想得到“我想买香蕉”。我该怎么做?当我看到 LOWER 和 UPPER 时,我期待 PROPER(Bananas) 函数,但似乎不支持 PROPER 大小写?
DZ
【问题讨论】:
【参考方案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
【讨论】:
以上是关于Big Query 中的正确案例的主要内容,如果未能解决你的问题,请参考以下文章
从 Airtable 到 Big Query 中正确且真实的 DateStamp 的十进制字符串样式
如何用 Google Big Query Table 中的另一个分区重写一个分区?
Google Big Query Error: CSV table 遇到太多错误,放弃。行:1 错误:1