以下功能在sql传统上可以正常使用,但是在sql标准上失败,并显示错误:
“对于参数类型:ARRAY,STRING,函数REGEXP_EXTRACT没有匹配的签名。支持的签名:REGEXP_EXTRACT(STRING,STRING); REGEXP_EXTRACT(BYTES,BYTES)”
regexp_extract(split(something,','), r'^(.*?)\:')
我试图用'。替换'。没有成功。 有什么想法吗?
答案 0 :(得分:3)
除了使用split
和regexp_extract
之外,您还可以使用JS中的UDF来轻松解析:
CREATE TEMPORARY FUNCTION parse(json STRING) RETURNS ARRAY<STRING>
LANGUAGE js AS """
p = JSON.parse(json);
arr = [];
for (var key in p) {
if (p.hasOwnProperty(key)) {
arr.push(key + "|" + p[key]);
}
}
return arr;""";
WITH foo AS (SELECT '''{"X":"2","Y":"1"}''' AS something)
SELECT parsed FROM foo, UNNEST(parse(something)) AS parsed
-
Row parsed
1 X|2
2 Y|1
但是,这是更多的代码/ SQL,对于您所需的内容可能有些过大。我只是想给您另一个选择,因为我不喜欢使用正则表达式!
答案 1 :(得分:0)
您需要将ARRAY
函数用作从SPLIT
返回的元素的for-each循环。例如,
SELECT
ARRAY(
SELECT regexp_extract(x, r'^(.*?)\:')
FROM UNNEST(split(something,',')) AS x
) AS result
FROM table