SQL регулярные выражения - удаление точки

Рейтинг: 0Ответов: 1Опубликовано: 20.04.2023

просьба подсказать, что делаю не так. Суть в том, что необходимо из таблицы dealer в столбце contract удалить все символы, которые идут в конце строки, и могут содержать (".","..","","/","_") В столбце контракт есть такие значения:

  • 100001-04..
  • 100003-04.
  • 100004-04./пилот
  • 100005-04/пилот
  • 100006-04\пилот
  • 100007-04.\пилот
  • 100008-04..
  • 100008-04_

В результате все символы и любой текст, что идет после "-04", должны быть удалены.

Использую следующий запрос:

SELECT
(
case 
when contract like '%/%' then regexp_replace(contract,'\\.*$','') -- ищем символ "/" и заменяем его и все что идет после пустой строкой
when contract like '%\\%' then regexp_replace(contract,'\\.*$','') -- ищем символ "\" и заменяем его и все что идет после пустой строкой
when contract like '%_%' then regexp_replace(contract,'\_*$','','g') -- ищем символ "_" и заменяем его и все что идет после пустой строкой
when contract like '%.' then regexp_replace(contract, '\\.\\s*$', '') -- ищем точку "." и заменяем ее и все что идет после пустой строкой
else contract -- если ничего не нашли выводим как есть
end
) as contract
FROM dealer as t1

В итоге код работает на всем, кроме "." и ".." В таблице все равно остаются записи

  • 100001-04..
  • 100003-04.

Н совесм понимаю, как от них избавится. БД POSTGRESQL

Ответы

▲ 1Принят
WITH cte (raw_value) AS (
SELECT '100001-04..' UNION ALL
SELECT '100003-04.' UNION ALL
SELECT '100004-04./пилот' UNION ALL
SELECT '100005-04/пилот' UNION ALL
SELECT '100006-04\пилот' UNION ALL
SELECT '100007-04.\пилот' UNION ALL
SELECT '100008-04..' UNION ALL
SELECT '100008-04_'
)
SELECT raw_value, regexp_replace(raw_value, '^(.*\d)\D*$', '\1') clear_value
FROM cte
raw_value clear_value
100001-04.. 100001-04
100003-04. 100003-04
100004-04./пилот 100004-04
100005-04/пилот 100005-04
100006-04\пилот 100006-04
100007-04.\пилот 100007-04
100008-04.. 100008-04
100008-04_ 100008-04

fiddle

Попросту отрезаем с задницы все нецифровые символы.