У меня есть столбец с такими данными, как
как я могу получить такой результат
Я пытаюсь использовать strpos и split_part, но у меня это не работает. Я думаю, что я должен сначала удалить текст, кроме "-" и "/". но я не знаю, как это сделать.
Вы можете попробовать использовать сопоставление регулярных выражений и замены, чтобы выполнить тяжелую работу. Сначала убедитесь, что входное значение ss_period
содержит две даты в ожидаемом формате, разделенном дефисом. Если это так, используйте замены регулярных выражений группами захвата, чтобы изолировать каждую дату. Если нет, то просто назначьте значение по умолчанию NULL
.
SELECT
ss,
CASE WHEN ss_period ~ '.*\d+/\d+/\d+-\d+/\d+/\d+.*'
THEN REGEXP_REPLACE(ss_period, '^.*(\d+/\d+/\d+)-.*$', '\1')
END AS ss_period_start,
CASE WHEN ss_period ~ '.*\d+/\d+/\d+-\d+/\d+/\d+.*'
THEN REGEXP_REPLACE(ss_period, '^.*-(\d+/\d+/\d+).*$', '\1')
END AS ss_period_end
FROM yourTable
ORDER BY ss;
Вы по-прежнему можете использовать функции STRPOS()
и SPLIT_PART()
, применяя CROSS
и LEFT JOIN
рекурсивно, например
SELECT t.ss,
SPLIT_PART(str, '-', 1) AS ss_period1, SPLIT_PART(str, '-', 2) AS ss_period2
FROM t
LEFT JOIN
(
SELECT ss, SPLIT_PART(ss_period, ' ', n) AS str
FROM t
CROSS JOIN generate_series(1, LENGTH(REGEXP_REPLACE(ss_period, '[^ ]', '', 'g'))+1) AS n
WHERE STRPOS(SPLIT_PART(ss_period, ' ', n),'-') > 0
) AS tt
ON tt.ss = t.ss
Я рассматриваю это как проблему, состоящую из двух частей. Сначала найдите строку с диапазоном. Затем разделите его на две части.
В первой части regexp_match()
, похоже, помогает. Для второго, split_part()
:
select t.*, split_part(v.rng, '-', 1), split_part(v.rng, '-', 2)
from t cross join lateral
(values ((regexp_match(ss_period, '[0-9]{1,2}/[0-9]{1,2}/[0-9]{4}-[0-9]{1,2}/[0-9]{1,2}/[0-9]{4}'))[1])
) v(rng);
Здесь db<>рабочий пример.
Чтобы пойти в том же направлении, что и ответ Тима, вы можете использовать функцию regexp_match()
:
SELECT ss , (regexp_match(ss_period, '\d{1,2}/\d{1,2}/\d{4}'))[1] AS ss_period_start , right((regexp_match(ss_period, '-\d{1,2}/\d{1,2}/\d{4}'))[1], -1) AS ss_period_end FROM your_table ;
Не могли бы вы показать свою лучшую нерабочую попытку? Тогда мы могли бы улучшить его.