regexp_replace в базе данных, чтобы инвертировать числовую строку и вставить точку между каждой цифрой

0

У меня есть база данных, где один столбец содержит числа. 3 примера значений:

1111111555
2222222555
3333333555

который мне нужно изменить и поставить точку между каждой цифрой. то есть результат для каждого из приведенных выше примеров:

5.5.5.1.1.1.1.1.1.1
5.5.5.2.2.2.2.2.2.2
5.5.5.3.3.3.3.3.3.3

соответственно.

Затем мне нужно обновить другой столбец с результатом. Как я могу сделать такую ​​замену?

Онлайн-тест regexp дает мне результат, который мне нужен:

(\S)(\S)(\S)(\S)(\S)(\S)(\S)(\S)(\S)(\S)/g$10.$9.$8.$7.$6.$5.$4.$3.$2.$1

но я не могу заставить его успешно обновлять базу данных. Любые идеи, как заставить его работать?

  • 1
    Я только что проверил: PostgreSQL допускает максимум 9 групп захвата, так что, похоже, вы не можете использовать регулярное выражение для этого.
  • 0
    Вы пометили свой вопрос как mysql и postgresql. Пожалуйста, укажите, какую базу данных вы на самом деле используете, или вам нужно решение для обоих.
Показать ещё 2 комментария
Теги:

5 ответов

2

Правильный ответ для PostgreSQL:

CREATE OR REPLACE FUNCTION reverse_array(ANYARRAY) RETURNS ANYARRAY AS $$
    SELECT array( (SELECT $1[i] FROM generate_series( array_upper($1, 1), array_lower($1, 1), -1 ) i ) );
$$ language sql;

# select array_to_string(
    reverse_array(
        regexp_split_to_array( i, '' )
    ), '.'
  )
  from (values ('1111111555'), ('2222222555'), ('3333333555')) x (i);
   array_to_string
---------------------
 5.5.5.1.1.1.1.1.1.1
 5.5.5.2.2.2.2.2.2.2
 5.5.5.3.3.3.3.3.3.3
(3 rows)
1
  • отменить строку обычными средствами (т.е. встроенной строковой функцией)
  • regex-replace (\d) с $1., глобально
  • удалите последнюю точку из результата

Более сложные регулярные выражения могут сэкономить вам последний шаг, например, с помощью внешнего вида. Я не уверен, что здесь поддерживает ваша СУБД выбора, поэтому я сохранил ее просто.

  • 2
    На всякий случай, если это поддерживается: замените (\d)(?=\d) на $1.
  • 0
    @Amarghosh: PostgreSQL - единственный, который поддерживает прогнозирование, так что это должно работать. Lookbehind не поддерживается, хотя.
0

Я пытаюсь оракула: ВЫБРАТЬ REGEXP_REPLACE (ОБРАТНОГО (телефон), '(\ г)', '\ 1.') из записей

4.3.2.1.1.1.1.1.1.1.1.1.

Эта работа для меня, даже последняя точка полезна, я собираюсь там приложить e164.arpa с concat. Но это следующий вопрос.

Спасибо всем вам!

0

Что-то вроде:

SELECT regexp_replace(reverse(yourcol), E'(\\S)(?=\\S)', E'\\1.', 'g')

должен работать. И, конечно, обновить

UPDATE yourtable SET yourcol=regexp_replace(...)
  • 0
    Он также хочет полностью изменить это - я пропустил это также :(
  • 0
    Гах. Для этого у меня есть reverse (), я забыл, что это пользовательская функция, которую я поместил в мою локальную базу данных: S Почему у нас нет reverse ()?
0

В Oracle, если ваше начальное значение находится в столбце f, вы можете сделать:

substr(regexp_replace(reverse(f), '(\d)', '\1.'), 0, (length(f) * 2) - 1)

Это использует подход, обозначенный Tomalek

Конечно, вместо (length(f) * 2) - 1 вы можете записать 19 код (length(f) * 2) - 1, если вы знаете, что исходное значение всегда будет ровно 10 цифр.

MySQL имеет функцию для выполнения соответствия регулярных выражений, но не поддерживает подстановку регулярного выражения, поэтому вам потребуется выполнить вложенную замену каждой цифры 0-9 по очереди. например для 1-3:

replace(replace(replace(reverse(f), '3', '3.'), '2', '2.'), '1', '1.')
  • 0
    Mysql также работает для решения с вами, но результаты странные, если есть более 10 цифр: 1.1..1.1..1.1..1.1..1.1..1. 2.2.2.2.2.2.2.2.2.2.2. Похоже, он хорошо понимает только до 9 ссылок, есть ли способ использовать больше?
  • 0
    Кажется, это работает нормально для меня с более длинными значениями, например, выберите заменить (заменить (заменить (обратная («11111111111222222222211111111»), «3», «3.»), «2», «2.»), «1», « 1. '); дает "1.1.1.1.1.1.1.1.2.2.2.2.2.2.2.2.2.2.1.1.1.1.1.1.1.1.1.1.1." - Какова ценность, с которой вы пытаетесь это сделать?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню