У меня есть база данных, где один столбец содержит числа. 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
но я не могу заставить его успешно обновлять базу данных. Любые идеи, как заставить его работать?
Правильный ответ для 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)
(\d)
с $1.
, глобальноБолее сложные регулярные выражения могут сэкономить вам последний шаг, например, с помощью внешнего вида. Я не уверен, что здесь поддерживает ваша СУБД выбора, поэтому я сохранил ее просто.
(\d)(?=\d)
на $1.
Я пытаюсь оракула: ВЫБРАТЬ REGEXP_REPLACE (ОБРАТНОГО (телефон), '(\ г)', '\ 1.') из записей
4.3.2.1.1.1.1.1.1.1.1.1.
Эта работа для меня, даже последняя точка полезна, я собираюсь там приложить e164.arpa с concat. Но это следующий вопрос.
Спасибо всем вам!
Что-то вроде:
SELECT regexp_replace(reverse(yourcol), E'(\\S)(?=\\S)', E'\\1.', 'g')
должен работать. И, конечно, обновить
UPDATE yourtable SET yourcol=regexp_replace(...)
В 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.')