Стандарт больших запросов против устаревшего синтаксиса - PullRequest
0 голосов
/ 01 сентября 2018

нижеприведенные функции отлично работают на устаревшем SQL, но не работают на стандарт SQL с ошибкой:

"Нет соответствующей подписи для функции REGEXP_EXTRACT для типов аргументов: ARRAY, STRING. Поддерживаемые подписи: REGEXP_EXTRACT (STRING, STRING); REGEXP_EXTRACT (BYTES, BYTES)"

 regexp_extract(split(something,','), r'^(.*?)\:')

Я пытался заменить "на" ... безуспешно. Есть идеи?

Ответы [ 2 ]

0 голосов
/ 01 сентября 2018

Вам необходимо использовать функцию ARRAY как цикл for-each для элементов, которые возвращаются из SPLIT. Например,

SELECT
  ARRAY(
    SELECT regexp_extract(x, r'^(.*?)\:')
    FROM UNNEST(split(something,',')) AS x
  ) AS result
FROM table
0 голосов
/ 01 сентября 2018

Вместо использования split и regexp_extract вы также можете перейти в UDF в JS, что позволяет легко анализировать:

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 и, вероятно, немного излишним для того, что вам нужно. Я просто хотел дать вам еще один вариант, так как я не большой поклонник использования регулярных выражений!

...