问题描述
CREATE OR REPLACE FUNCTION udf.title_case(str STRING)
RETURNS STRING
LANGUAGE js AS """
return str
.replace(/([^\\W_]+[^\\s-]*) */g,function(txt){return txt.charat(0).toupperCase() + txt.substr(1).toLowerCase();})
""";
更新:
我将 chartAt
修正为 charat
,但仍然出现相同的错误
它产生以下错误:
"project.dataset.charat" is not a function at UDF$1(STRING) line 3,columns 110-111
我可以通过使用 []
表示法绕过这个错误,这并不理想,但是我用 substr
遇到了同样的错误。
我通常在 JSBin 或类似工具中测试我的函数并且工作正常,但是当将其转换为 Bigquery 时,我需要在正则表达式中转义 \
,然后处理这些意外的错误。
对于那些没有 JS 编程艺术经验的人来说,生活变得更加艰难。
预先感谢您的帮助。
解决方法
考虑使用 INITCAP 函数代替 JS UDF
它需要一个 STRING 并返回它,每个单词中的第一个字符大写,所有其他字符小写
例如
SELECT INITCAP('I have the following function to convert any string to title case:')
产生以下输出
,你写错了函数名,“char[t]At”而不是“charAt”。 我使用临时函数来测试
CREATE TEMP FUNCTION tempFunc(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 tempFunc("abce")
结果是“Abce”。 您可以在 bigquery 编辑器中尝试此查询