ths*_*art 0 string google-bigquery
我需要大写一个字符串:
约翰·多伊 -> 约翰·多伊
这该怎么做?
我想需要使用 NORMALIZE_AND_CASEFOLD,但它返回一个小写。
NORMALIZE_AND_CASEFOLD
NORMALIZE_AND_CASEFOLD(value[, normalization_mode]) 说明
取一个字符串、值,并执行与 NORMALIZE 相同的操作,以及对不区分大小写的操作进行大小写折叠。
NORMALIZE_AND_CASEFOLD 支持四种可选的归一化模式:
值 名称 说明 NFC 规范化形式 Canonical Composition 通过规范等价分解和重组字符。NFKC Normalization Form Compatibility Composition 通过兼容性分解字符,然后通过规范等价重新组合它们。NFD Normalization Form Canonical Decomposition 通过规范等价分解字符,多个组合字符按特定顺序排列。NFKD Normalization Form Compatibility Decomposition 按兼容性分解字符,多个组合字符按特定顺序排列。
下面是 BigQuery 标准 SQL 并使用 JS UDF(第一个查询)和 SQL UDF(第二个)
#standardSQL
CREATE TEMPORARY FUNCTION capitalize(str STRING)
RETURNS STRING
LANGUAGE js AS """
return str.replace(
/\\w\\S*/g,
function(txt) {
return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
}
);
""";
SELECT str, capitalize(str) capitalized_str
FROM `project.dataste.table`
Run Code Online (Sandbox Code Playgroud)
或者
#standardSQL
CREATE TEMPORARY FUNCTION capitalize(str STRING) AS ((
SELECT STRING_AGG(CONCAT(UPPER(SUBSTR(word, 1, 1)), LOWER(SUBSTR(word, 2))), ' ' ORDER BY pos)
FROM UNNEST(SPLIT(str, ' ')) word WITH OFFSET pos
));
SELECT str, capitalize(str) capitalized_str
FROM `project.dataste.table`
Run Code Online (Sandbox Code Playgroud)
您可以使用虚拟数据进行上面的测试
WITH `project.dataste.table` AS (
SELECT 'john doe' AS str UNION ALL
SELECT 'abc xyz'
)
Run Code Online (Sandbox Code Playgroud)
两个选项的结果:
Row str capitalized_str
1 john doe John Doe
2 abc xyz Abc Xyz
Run Code Online (Sandbox Code Playgroud)
为 JS UDF 添加了最简洁/更精简的版本
#standardSQL
CREATE TEMPORARY FUNCTION capitalize(str STRING)
RETURNS STRING
LANGUAGE js AS """
return str.replace(/\\b(.)/g, function(match, chr){return chr.toUpperCase();});
""";
SELECT str, capitalize(str) capitalized_str
FROM `project.dataste.table`
Run Code Online (Sandbox Code Playgroud)