PostgreSQL разделяет значения одного столбца на несколько столбцов на основе шаблона - PullRequest
0 голосов
/ 03 октября 2019

Я использую SAS EG для базы данных Postgres с явным сквозным SQL. У меня есть грязный стол, который мне дали, и мне нужно «навести порядок» для конечного пользователя. Один из столбцов (varchar255) в таблице имеет несколько значений даты, сгруппированных вместе. Большинство значений имеют только одно значение даты (т.е. 10/11/2018), но некоторые выглядят так (8/11/201810/6/2019). Мне нужно разделить их, но нет разделителя, в котором можно разделить, кроме, может быть, шаблон, но даже тогда это переменная длина, поэтому я не знаю, как это сделать. В основном, первая дата в последовательности может быть (1-2 числа месяца / 1-2 числа дня / 4 числа года), за которой следует следующая дата. Как я могу разделить их и разделить их разделителем, чтобы я мог затем выполнить split_to_array, подсчитать наибольшее количество отдельных значений в массиве и затем создать соответствующее число новых столбцов для размещения отдельных дат? Обычно я предоставляю пример кода, но в этом случае я даже не знаю, где начать анализировать их.

Пример исходного значения:

row1 6/4/2017
row2 8/11/201810/6/2019
row3 10/16/20134/12/201812/18/2019

Пример требуемого значения:

row1 6/4/2017
row2 8/11/2018, 10/6/2019
row3 10/16/2013, 4/12/2018, 12/18/2019

Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 03 октября 2019

Вы должны иметь возможность создавать регулярные выражения, соответствующие вашим датам. Это работает в САС. Обратите внимание, что он добавляет дополнительную запятую, но вы можете либо удалить ее, выяснить, как сделать более сложное регулярное выражение, либо просто проигнорировать дополнительную запятую.

WANT=prxchange('s/(\d{1,2}\/\d{1,2}\/\d{4})/$1,/',-1,HAVE);

Похоже, у Postgres есть функция regex_replace ()так что-то вроде этого должно работать

regexp_replace(HAVE,'(\d{1,2}/\d{1,2}/\d{4})','\1,','g') as WANT
1 голос
/ 03 октября 2019

Используйте функцию PostgreSQL regexp_match.

Из документов PostgreSQL https://www.postgresql.org/docs/current/functions-matching.html

В общем случае, когда вам просто нужна вся соответствующая подстрока или NULL для отсутствия совпадений,напишите что-то вроде

SELECT (regexp_match('foobarbequebaz', 'bar.*que'))[1];
regexp_match
--------------
barbeque

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

regexp_match(mashed, '(\d{1,2}/\d{1,2}/\d{4})`) as datestring1,
regexp_match(mashed,  '\d{1,2}/\d{1,2}/\d{4}(\d{1,2}/\d{1,2}/\d{4})`) as datestring2,
etc … 
...