#sql #regex #google-bigquery
# #sql #регулярное выражение #google-bigquery
Вопрос:
У меня есть таблица в BigQuery:
ab_col_jfsfhfd_ggg_sdf
arfd_am_fdsf_fddg_fg
d_fdf_fdddg_ffddd_f
Я хотел бы извлечь те символы, которые идут сразу после первого символа _ и за которыми следует второй символ _ . Я хочу получить следующее:
col
am
fdf
Я использовал следующее регулярное выражение для извлечения символов, но оно работает не так, как предполагалось:
^.*_(D )_.*$
regexp_replace(id,'^.*\_(\D )\_.*
Пожалуйста, помогите!
Ответ №1:
Если я правильно вас понял, вы можете использовать split()
:
(split(col, '_'))[safe_ordinal(2)]
split()
превращает столбец string в массив значений с заданным разделителем (здесь мы используем _
). Тогда мы можем просто захватить второй элемент массива.
Комментарии:
1. Я получаю эту ошибку: индекс массива 2 выходит за пределы (переполнение)
2. @Alex: тогда, похоже, некоторые из ваших строк не содержат символов
_
. Вы можете использоватьsafe_ordinal()
, чтобы избежать этой ошибки (и вернутьnull
в таком случае).
Ответ №2:
split()
это очень простой способ решения этой проблемы. Но регулярные выражения также довольно просты:
with t as (
select 'ab_col_jfsfhfd_ggg_sdf' as id union all
select 'arfd_am_fdsf_fddg_fg' union all
select 'd_fdf_fdddg_ffddd_f'
)
select id, regexp_extract(id, '[^_] ', 1, 2)
from t;
Логика шаблона такова: "Ищите любую строку символов, которая не является символом подчеркивания. Затем возьмите второй символ в строке. "
Ответ №3:
Использовать regexp_extract
:
regexp_extract(id,'^[^_] _([^_] )')
Смотрите доказательство
Объяснение
--------------------------------------------------------------------------------
^ the beginning of the string
--------------------------------------------------------------------------------
[^_] any character except: '_' (1 or more times
(matching the most amount possible))
--------------------------------------------------------------------------------
_ '_'
--------------------------------------------------------------------------------
( group and capture to 1:
--------------------------------------------------------------------------------
[^_] any character except: '_' (1 or more
times (matching the most amount
possible))
--------------------------------------------------------------------------------
) end of 1
, '\1')
Пожалуйста, помогите!
Ответ №1:
Если я правильно вас понял, вы можете использовать split()
:
split()
превращает столбец string в массив значений с заданным разделителем (здесь мы используем _
). Тогда мы можем просто захватить второй элемент массива.
Комментарии:
1. Я получаю эту ошибку: индекс массива 2 выходит за пределы (переполнение)
2. @Alex: тогда, похоже, некоторые из ваших строк не содержат символов
_
. Вы можете использоватьsafe_ordinal()
, чтобы избежать этой ошибки (и вернутьnull
в таком случае).
Ответ №2:
split()
это очень простой способ решения этой проблемы. Но регулярные выражения также довольно просты:
Логика шаблона такова: «Ищите любую строку символов, которая не является символом подчеркивания. Затем возьмите второй символ в строке. »