2013-06-10 3 views
0

Я в настоящее время работаю по миграции данных в PostgreSQL. Поскольку я новичок в создании регулярных выражений, у меня возникли проблемы с простым шаблоном и я буду благодарен за вашу помощь.POSIX регулярных выражений, чтобы разбить таблицу

Я хочу иметь регулярное выражение разделить мой стол на каждой буквенно-цифровой полукокса в колонке, например. если столбец содержит строку 'abc' Я хотел бы разделить его на 3 строки: ['a', 'b', 'c']. Мне нужно regexp для этого

Второй случай немного сложнее, я хотел бы разделить выражение '105AB' на ['105A', '105B'], я хотел бы скопировать числа в начале строки и разбить таблицу на буквы в верхнем регистре, в конце, соединяющие число с ровно 1 заглавной буквой.

функция я буду использовать это, вероятно, regexp_split_to_table(string, regexp)

Я намеренно предоставляя очень мало данных, чтобы не путать никого, так что я отправил это суть проблемы. Если вам нужна дополнительная информация, прокомментируйте.

ответ

1

Первое уже был решен вами:

select regexp_split_to_table(s, ''), i 
from (values 
    ('abc', 1), 
    ('def', 2) 
) s(s, i); 
regexp_split_to_table | i 
-----------------------+--- 
a      | 1 
b      | 1 
c      | 1 
d      | 2 
e      | 2 
f      | 2 

Во втором случае вы не говорите, если Числовые всегда первое дерево символы:

select 
    left(s, 3) || regexp_split_to_table(substring(s from 4), ''), i 
from (values 
    ('105AB', 1), 
    ('106CD', 2) 
) s(s, i); 
?column? | i 
----------+--- 
105A  | 1 
105B  | 1 
106C  | 2 
106D  | 2 

Для переменного числа числовые:

select n || a, i 
from (
    select 
     substring(s, '^\d{1,3}') n, 
     regexp_split_to_table(substring(s, '[A-Z]+'), '') a, 
     i 
    from (values 
     ('105AB', 1), 
     ('106CD', 2) 
    ) s(s, i) 
) s; 
?column? | i 
----------+--- 
105A  | 1 
105B  | 1 
106C  | 2 
106D  | 2 
+0

первое решение работает, спасибо Что касается второй один, длина числовых значений является переменной величиной (1-3), но ваша идея подтолкнула меня вперед, я буду стараться использовать regexp_replace на это и, возможно, выработать решение в течение следующих 15 минут :) Большое спасибо – fetta

+0

@fetta Проверьте мой отредактированный ответ, если вы еще не разработали его. –

+1

Я делал это в diffrent образом: 'REGEXP_REPLACE (t2.oddzial, '[~ A-Za-Z] +', '') || regexp_split_to_table (regexp_replace (regexp_replace (t2.oddzial, '[0-9] +', ''), '[~ az] +', ''), '') odd' где t2.oddzial - столбец, который I «м снова разделив спасибо :) – fetta

Смежные вопросы