Чтобы разделить строку на 2 столбца с соблюдением определенной максимальной длины (после logi c, описанного вами), мы будем использовать JavaScript Пользовательскую функцию в BigQuery (UDF) вместе с встроенная функция LENGTH .
Сначала будет проанализирована строка. Если символ после максимального порога является пробелом, он будет разделен на заданную максимальную длину строки. Однако, если это не так, каждый символ будет проверяться, считая в обратном порядке, пока не будет обнаружен пробел и строка не будет разделена. Эта процедура позволяет избежать функции разбиения слова, и оно всегда будет разделяться с соблюдением максимально допустимой длины.
Ниже приведен запрос с некоторыми образцами данных,
CREATE TEMP FUNCTION split_str_1(s string,len int64)
RETURNS string
LANGUAGE js AS """
var len_aux = len, prev = 0;
//first part of the string within the threshold
output = [];
//the rest of the string wihtout the first part
output2 = [];
//if the next character in the string is a whitespace, them split the string
if(s[len_aux++] == ' ') {
output.push(s.substring(prev,len_aux));
output2.push(s.substring(prev,s.length));
}
else{
do {
if(s.substring(len_aux - 1, len_aux) == ' ')
{
output.push(s.substring(prev,len_aux));
prev = len_aux;
output2.push(s.substring(prev,s.length));
break;
}len_aux--;
} while(len_aux > prev)
}
//outputting the first part of the string
return output[0];
""";
CREATE TEMP FUNCTION split_str_2(s string,len int64)
RETURNS string
LANGUAGE js AS """
var len_aux = len, prev = 0;
//first part of the string within the threshold
output = [];
//the rest of the string wihtout the first part
output2 = [];
//if the next character in the string is a whitespace, them split the string
if(s[len_aux++] == ' ') {
output.push(s.substring(prev,len_aux));
output2.push(s.substring(prev,s.length));
}
else{
do {
if(s.substring(len_aux - 1, len_aux) == ' ')
{
output.push(s.substring(prev,len_aux));
prev = len_aux;
output2.push(s.substring(prev,s.length));
break;
}len_aux--;
} while(len_aux > prev)
}
//outputting the first part of the string
return output2[0];
""";
WITH data AS (
SELECT "Trying to split a string with more than 25 characters length" AS str UNION ALL
SELECT "Trying to split" AS str
)
SELECT str,
IF(LENGTH(str)>25, split_str_1(str,25), null) as column_1,
CASE WHEN LENGTH(str)>25 THEN split_str_2(str,25) ELSE str END AS column_2
FROM data
И выход,
введите описание изображения здесь
Обратите внимание, что существует 2 JavaScript UDF, потому что первый возвращает первую часть строки, а второй возвращает вторую часть, если строка длиннее 25 символов. Кроме того, в качестве аргумента передается максимально допустимая длина, но ее можно статически определить в UDF как len=25
.