Создать новый столбец со всем, что находится между третьим и четвертым столбцом другого столбца. - PullRequest
2 голосов
/ 11 июля 2020

Мне нужно создать новый столбец на основе столбца col, извлекая все, что находится между третьим - и четвертым -. Примеры: ABC-123-aaa-INEEDTHIS-2000-BBB-123-CCC 111-AAAAA-bb-INEEDTHIS-BB-435-A

Как это сделать с помощью Big Query? Я пробую что-то вроде этого:

SELECT REGEXP_EXTRACT(col, r'\w\w[^\d]\d\d') as newcol from mytable

Я тоже хотел бы понять regex, стоящий за этим решением, если возможно.

1 Ответ

4 голосов
/ 11 июля 2020

Ниже приведен стандарт BigQuery. SQL

Самый простой способ - использовать функцию SPLIT, как в примере ниже

SELECT SPLIT(col, '-')[SAFE_OFFSET(3)] AS newcol   

Если по какой-то причине вы хотите go с обычным выражение - вы можете использовать REGEXP_EXTRACT, как в примере ниже

REGEXP_EXTRACT(col, r'(?:[^-]*-){3}([^-]+)') AS newcol   

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

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 'ABC-123-aaa-INEEDTHIS-2000-BBB-123-CCC' col UNION ALL
  SELECT '111-AAAAA-bb-INEEDTHIS-BB-435-A'
)
SELECT 
  col, 
  SPLIT(col, '-')[SAFE_OFFSET(3)] AS newcol_with_split,
  REGEXP_EXTRACT(col, r'(?:[^-]*-){3}([^-]+)') AS newcol_with_regexp
FROM `project.dataset.table`   

с выходом

Row col                                     newcol_with_split   newcol_with_regexp   
1   ABC-123-aaa-INEEDTHIS-2000-BBB-123-CCC  INEEDTHIS           INEEDTHIS    
2   111-AAAAA-bb-INEEDTHIS-BB-435-A         INEEDTHIS           INEEDTHIS      

Краткое объяснение регулярного выражения

  1. [^-]*- захватывает такие записи, как ABC-, 123-, aaa- et c.
  2. (?:[^-]*-) гарантирует, что эти записи не будут извлечены
  3. (?:[^-]*-){3} гарантирует, что первые три таких записи будут пропущены
  4. Наконец, ([^-]+) извлекает целевой фрагмент до следующего -
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...