Соедините массивы (для каждой строки), используя стандартный SQL в BigQuery - PullRequest
0 голосов
/ 27 августа 2018

У меня есть таблица, которая содержит один столбец со строками

table_1.row_a: "ABC" "DEF" "GHI"

И функция UDF JavaScript, которая принимает строку в качестве входных данныхи выводит массив строк для каждой строки.

splitStrings(table_1.row_a)

["A", "B", "C"]
["D", "E", "F"]
["G", "H", "I"]

Как можно объединить эти результаты, чтобы получить желаемую таблицу вывода:

A
B
C
D
E
F..

Пока у меня есть следующий код:

CREATE TEMP FUNCTION splitStrings(str STRING)
RETURNS ARRAY<STRING>
LANGUAGE js AS """

return str.split();

""";

SELECT * FROM UNNEST(["ABCD", "EFGH", "IJKL", "MNOP"]) AS words
CROSS JOIN UNNEST(splitStrings(words))

Однако результат таков:

-WORDS-   f0_
ABCD .    ABCD
EFGH .    EFGH
IJKL .    IJKL
MNOP .    MNOP

И я хотел бы получить по одной букве в строке AB C ..

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Ниже приведен пример для BigQuery Standard SQL

#standardSQL
WITH `project.dataset.table` AS (
  SELECT "ABC" word UNION ALL
  SELECT "DEF" UNION ALL
  SELECT "GHI" 
)
SELECT value
FROM `project.dataset.table`, UNNEST(SPLIT(word, '')) value   

с результатом:

Row value    
1   A    
2   B    
3   C    
4   D    
5   E    
6   F    
7   G    
8   H    
9   I    
0 голосов
/ 27 августа 2018

Почему бы просто не использовать union all?

select col1 from t union all
select col2 from t union all
select col3 from t;

Или, если вы действительно хотите использовать массивы, UDF не нужен:

select val
from (select 'A' as a, 'B' as b, 'C' as c union all
      select 'D', 'E', 'F' union all
      select 'G', 'H', 'I'
     ) x cross join
     unnest(array[a, b, c]) val;

Что касается вашего подхода, я думаюВы хотите:

SELECT val
FROM table_1 CROSS JOIN
     UNNEST(splitStrings(table_1.row_a)) val;

То есть выберите результат из UNNEST().

...