我有一个专栏,我在雪花分裂。格式如下:
我在查询中使用了split_to_table(A, ','),但您可能会发现,这也不正确地拆分了Scooter > Sprinting, Jogging and Walking记录。也许有定界符只工作,如果没有空格的任何一边?因为我看不出一个不同的条件,可以工作。我一直在网上搜索,但还没有找到合适的工作,有没有人遇到过类似的问题在过去?谢谢
split_to_table(A, ',')
Scooter > Sprinting, Jogging and Walking
2wnc66cl1#
这是分割目的数据表的自订规则,因此我们可以使用UUTF来套用自订规则:
create or replace function split_to_table2(STR string, DELIM string, ROW_MUST_CONTAIN string) returns table (VALUE string) language javascript strict immutable as $$ { initialize: function (argumentInfo, context) { }, processRow: function (row, rowWriter, context) { var buffer = ""; var i; const s = row.STR.split(row.DELIM); for(i=0; i<s.length-1; i++) { buffer += s[i]; if(s[i+1].includes(row.ROW_MUST_CONTAIN)) { rowWriter.writeRow({VALUE: buffer}); buffer = ""; } else { buffer += row.DELIM } } rowWriter.writeRow({VALUE: s[i]}) }, } $$; select VALUE from table(split_to_table2('Car > Bike,Bike > Scooter,Scooter > Sprinting, Jogging and Walking,Walking > Flying', ',', '>')) ;
输出量:| 价值|| - -|| 汽车〉自行车|| 自行车〉滑板车|| 踏板车〉短跑、慢跑和步行|| 行走〉飞行|此UUTF比内置表函数split_to_table中的两个参数多添加一个参数。第三个参数ROW_MUST_CONTAIN是行必须包含的字符串。它在DELIM上拆分字符串,但如果它没有ROW_MUST_CONTAIN字符串,它连接字符串以形成行的完整字符串。在本例中,我们只指定,作为分隔符,>作为ROW_MUST_CONTAIN。
split_to_table
,
>
gkn4icbw2#
我们可以巧妙地使用regexp_replace,在拆分表之前将实际的分隔符替换为其他内容。我使用的是双管道'||',但您可以将其更改为其他内容。'\|\|\\1'技巧称为反向引用,它允许我们将捕获的组(\\1)作为替换(\|\|)的一部分包含在内。
regexp_replace
'||'
'\|\|\\1'
\\1
\|\|
set str='car>bike,bike>car,truck, and jeep,horse>cat,truck>car,truck, and jeep'; select $str, * from table(split_to_table(regexp_replace($str,',([^>,]+>)','\|\|\\1'),'||'))
pnwntuvh3#
是的,你是对的。我能看到的唯一模式是逗号后面有空格的模式。这是一个小的变通方法,但我们可以利用这种模式。在下面的代码中,我替换了逗号,后面有空格。然后我对表函数应用split,并将之前的替换转换回来。如果字符串包含“my_replacement”或任何其他新模式,它并不十分漂亮,而且会崩溃,但它对我很有效:
select replace(t.value, 'my_replacement', ', ') from table( split_to_table(replace('Car > Bike,Bike > Scooter,Scooter > Sprinting, Jogging and Walking,Walking > Flying', ', ', 'my_replacement'),',')) t
3条答案
按热度按时间2wnc66cl1#
这是分割目的数据表的自订规则,因此我们可以使用UUTF来套用自订规则:
输出量:
| 价值|
| - -|
| 汽车〉自行车|
| 自行车〉滑板车|
| 踏板车〉短跑、慢跑和步行|
| 行走〉飞行|
此UUTF比内置表函数
split_to_table
中的两个参数多添加一个参数。第三个参数ROW_MUST_CONTAIN是行必须包含的字符串。它在DELIM上拆分字符串,但如果它没有ROW_MUST_CONTAIN字符串,它连接字符串以形成行的完整字符串。在本例中,我们只指定,
作为分隔符,>
作为ROW_MUST_CONTAIN。gkn4icbw2#
我们可以巧妙地使用
regexp_replace
,在拆分表之前将实际的分隔符替换为其他内容。我使用的是双管道'||'
,但您可以将其更改为其他内容。'\|\|\\1'
技巧称为反向引用,它允许我们将捕获的组(\\1
)作为替换(\|\|
)的一部分包含在内。pnwntuvh3#
是的,你是对的。我能看到的唯一模式是逗号后面有空格的模式。
这是一个小的变通方法,但我们可以利用这种模式。在下面的代码中,我替换了逗号,后面有空格。然后我对表函数应用split,并将之前的替换转换回来。
如果字符串包含“my_replacement”或任何其他新模式,它并不十分漂亮,而且会崩溃,但它对我很有效: