我有一列要在雪花中拆分。
格式如下:

我一直split_to_table(A, ',')在我的查詢中使用,但您可能會錯誤地告訴這也會拆分Scooter > Sprinting, Jogging and Walking記錄。
也許只有在它的兩邊都沒有間隔的情況下才有分隔符?因為我看不到其他可行的條件。
我一直在網上研究,但還沒有找到合適的作業,過去有沒有人遇到過類似的問題?
謝謝
uj5u.com熱心網友回復:
這是拆分到表格的自定義規則,因此我們可以使用 UDTF 應用自定義規則:
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', ',', '>'))
;
輸出:
| 價值 |
|---|
| 汽車 > 自行車 |
| 自行車 > 滑板車 |
| 滑板車 > 短跑、慢跑和步行 |
| 步行 > 飛行 |
此 UDTF 比內置表函式中的兩個引數多了一個引數split_to_table。第三個引數 ROW_MUST_CONTAIN 是行必須包含的字串。它在 DELIM 上拆分字串,但如果它沒有 ROW_MUST_CONTAIN 字串,它會將字串連接起來形成一行的完整字串。在這種情況下,我們只需指定,分隔符和>ROW_MUST_CONTAIN。
uj5u.com熱心網友回復:
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'),'||'))
uj5u.com熱心網友回復:
是的你是對的。我能看到的唯一模式是逗號后有空格的模式。
這是一個小的解決方法,但我們可以利用這種模式。在下面的代碼中,我替換了這樣的逗號,之后我們確實有空格。然后我將拆分應用于表函式,并將先前的替換轉換回來。
它不是超級漂亮,如果您的字串包含“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
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/520954.html
