如何将字符串大写?

ths*_*art 0 string google-bigquery

我需要大写一个字符串:

约翰·多伊 -> 约翰·多伊

这该怎么做?

我想需要使用 NORMALIZE_AND_CASEFOLD,但它返回一个小写。

https://cloud.google.com/bigquery/docs/reference/standard-sql/functions-and-operators#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 按兼容性分解字符,多个组合字符按特定顺序排列。

Mik*_*ant 5

下面是 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)