Regex - Как мне соответствовать слово яблоко, а не pine_apple в BigQuery - PullRequest
0 голосов
/ 04 мая 2018

Есть две корзины. Basket_1 содержит яблоко, манго и апельсин. Корзина 2 содержит 2 яблока и 2 сосны. Шаблон регулярного выражения «яблоко» соответствует слову «яблоко» и «pine_apple». Пожалуйста, уточните.

#standardSQL
with table1 as(
SELECT "basket_1" as basket,"apple" as fruit UNION ALL
SELECT "basket_1","mango" as fruit UNION ALL
SELECT "basket_2","apple" as fruit UNION ALL
SELECT "basket_2","apple" as fruit UNION ALL
SELECT "basket_2","pine_apple" as fruit UNION ALL
SELECT "basket_2","pine_apple" as fruit UNION ALL
SELECT "basket_1","orange" as fruit 
)
SELECT basket,string_agg(fruit)fruits_in_each_basket,regexp_extract_all(string_agg(fruit),r'(?i)apple')apple from table1 group by basket

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Исходя из того, как вы задали вопрос - я действительно чувствую, что в вашей реальной таблице есть только один ряд на корзину с двумя полями: корзина и фрукты, как показано ниже

WITH `project.dataset.your_table` AS (
  SELECT "basket_1" AS basket, "apple,mango,orange" AS fruits UNION ALL
  SELECT "basket_2","apple,apple,pine_apple,pine_apple" UNION ALL
  SELECT "basket_3","mango, orange" 
)

если это правильно - ниже описано, как с этим бороться

#standardSQL
SELECT basket, fruits,
  ARRAY(SELECT fruit FROM UNNEST(SPLIT(fruits)) fruit WHERE LOWER(fruit) = 'apple') apples
FROM `project.dataset.your_table`

Вы можете протестировать / поиграть с ним, используя указанные выше фиктивные данные как

#standardSQL
WITH `project.dataset.your_table` AS (
  SELECT "basket_1" AS basket, "apple,mango,orange" AS fruits UNION ALL
  SELECT "basket_2","apple,apple,pine_apple,pine_apple" UNION ALL
  SELECT "basket_3","mango, orange" 
)
SELECT basket, fruits,
  ARRAY(SELECT fruit FROM UNNEST(SPLIT(fruits)) fruit WHERE LOWER(fruit) = 'apple') apples
FROM `project.dataset.your_table`   

и результат будет

Row basket      fruits                              apples   
1   basket_1    apple,mango,orange                  apple    
2   basket_2    apple,apple,pine_apple,pine_apple   apple    
                                                    apple    
3   basket_3    mango, orange        
0 голосов
/ 04 мая 2018

Вот альтернативная версия, в которой не используется регулярное выражение. Он опирается на ARRAY_AGG с условием, которое оценивается как NULL, если фрукт не является яблоком, и пропускает добавление этих строк в массив:

#standardSQL
with table1 as(
SELECT "basket_1" as basket,"apple" as fruit UNION ALL
SELECT "basket_1","mango" as fruit UNION ALL
SELECT "basket_2","apple" as fruit UNION ALL
SELECT "basket_2","Apple" as fruit UNION ALL
SELECT "basket_2","pine_apple" as fruit UNION ALL
SELECT "basket_2","pine_apple" as fruit UNION ALL
SELECT "basket_1","orange" as fruit 
)
SELECT
  basket,
  STRING_AGG(fruit) AS fruits_in_each_basket,
  ARRAY_AGG(IF(LOWER(fruit) = 'apple', fruit, NULL) IGNORE NULLS) AS apple 
FROM table1
GROUP BY basket
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...