Я хочу знать, как выполнить CONNECT BY REGEXP в запросе Google Big - PullRequest
0 голосов
/ 25 января 2019

У меня есть следующее утверждение в oracle sql. Я хочу запустить его в Google Big Query.

CONNECT BY REGEXP_SUBSTR(VALUE, '[^,]+', 1, LEVEL) IS NOT NULL)

Как мне выполнить приведенный выше код в запросе Big?

1 Ответ

0 голосов
/ 25 января 2019

Я предполагаю здесь - но обычно эта конструкция используется для так называемой декомпозиции строк

Так, в BigQuery вы можете использовать SPLIT (значение) или REGEXP_EXTRACT_ALL (значение, r '[^,] +')для этого, как в следующих примерах

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 1 id, '1,2,3,4,5,6,7' AS value UNION ALL
  SELECT 2, 'a,b,c,d'
)
SELECT id, SPLIT(value) value
FROM `project.dataset.table`   

или

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 1 id, '1,2,3,4,5,6,7' AS value UNION ALL
  SELECT 2, 'a,b,c,d'
)
SELECT id, REGEXP_EXTRACT_ALL(value, r'[^,]+') value
FROM `project.dataset.table`  

оба приведенных выше запроса вернут

Row id  value    
1   1   1    
        2    
        3    
        4    
        5    
        6    
        7    
2   2   a    
        b    
        c    
        d     

Здесь, как вы можете видеть, - значение в каждой строкеразбивается на массив элементов, но все еще в одной строке

Чтобы сгладить результат, вы можете дополнительно использовать UNNEST (), как в следующих примерах

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 1 id, '1,2,3,4,5,6,7' AS value UNION ALL
  SELECT 2, 'a,b,c,d'
)
SELECT id, value
FROM `project.dataset.table`,
UNNEST(SPLIT(value)) value  

или

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 1 id, '1,2,3,4,5,6,7' AS value UNION ALL
  SELECT 2, 'a,b,c,d'
)
SELECT id, value
FROM `project.dataset.table`, 
UNNEST(REGEXP_EXTRACT_ALL(value, r'[^,]+')) value   

оба возвращают результат ниже (со всеми извлеченными элементами в отдельной строке)

Row id  value    
1   1   1    
2   1   2    
3   1   3    
4   1   4    
5   1   5    
6   1   6    
7   1   7    
8   2   a    
9   2   b    
10  2   c    
11  2   d    
...