У меня есть вариант использования, когда мне нужно разделить строки несколькими разделителями.
select client_id ,split(client_id,'-')[0] col1` ,split(client_id,'-')[1] col2 from mytbl
возвращает
Я пробовал различные перестановки, чтобы вставить два разделителя, но безуспешно.
select client_id ,split(client_id,'-'||'_')[0] col1` ,split(client_id,'-'||'_')[1] col2 from mytbl
это ошибка, но я хочу вернуть...
Вы можете использовать regexp_split_to_array с регулярным выражением-разделителем, представляющим собой тире или подчеркивание:
select
client_id,
(regexp_split_to_array(client_id, '[-_]'))[1] col1,
(regexp_split_to_array(client_id, '[-_]'))[2] col2
from mytbl;
Вот POC скрипки: https://www.db-fiddle.com/f/4jyoMCicNSZpjMt4jFYoz5/13029
Спасибо за отзыв @Zegarek — обновил фрагмент и поэкспериментировал с полным решением, а не только с POC использования regexp_split_to_array
Спасибо за внимание к замечанию. Хорошо, что вы протестировали и исправили корректность предложенного вами кода, но вы не заботитесь о производительности: вы утяжеляете ситуацию из-за накладных расходов на регулярные выражения и массивы. Тем не менее, после устранения проблем, если производительность достаточна для OP, решение не хуже любого другого - в конце концов, им не нужна спортивная машина, чтобы добраться из А в Б.
Вы можете сделать это именно так, как планировали, при условии, что вы translate() все альтернативные разделители по сравнению с тем, который вы хотите использовать: демо
select client_id
, split_part(client_id2,'-',1)
, split_part(client_id2,'-',2)
from mytbl cross join lateral
(values(translate(client_id,'_;/','---'))) as v(client_id2)
В этом подходе приятно то, что он работает быстрее по сравнению с идеями регулярного выражения + массива. Демо показывает, что этот метод работает на 3x
быстрее на случайных выборках размером 10–300 тысяч благодаря свободе от снижения производительности, связанного с накладными расходами на регулярные выражения и массивы.
Простое решение в Databricks (поскольку в вашем вопросе есть тег Databricks)
select
client_id,
split(client_id, '-|_')[0] col1,
split(client_id, '-|_')[1] col2
from
mytbl
Это синтаксически неправильно в двух отношениях: обычные массивы PostgreSQL основаны на 1, поэтому
[0]
просто даст вамnull
, и вам нужно заключить вызов в круглые скобки, чтобы иметь возможность подписать результирующий массив квадратными скобками, чтобы избежать еще одной синтаксической ошибки. . Скрипка, на которую вы ссылаетесь, не демонстрирует предлагаемый вами код - я не уверен, почему вы просто не протестировали там свое решение.