regexp_replace в базе данных, чтобы инвертировать числовую строку и вставить точку между каждой цифрой - PullRequest
0 голосов
/ 08 января 2010

У меня есть база данных, где один столбец содержит числа. 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

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

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

Он-лайн тест на регулярное выражение дает мне нужный мне результат:

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

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

Ответы [ 5 ]

2 голосов
/ 08 января 2010

Правильный ответ для 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 голос
/ 08 января 2010
  1. обратная строка обычным способом (т. Е. Встроенная строковая функция)
  2. regex-replace (\d) на $1., глобально
  3. удалить последнюю точку из результата

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

0 голосов
/ 08 января 2010

Я пытаюсь оракула: SELECT REGEXP_REPLACE (REVERSE (телефон), '(\ d)', '\ 1.') Из записей

4.3.2.1.1.1.1.1.1.1.1.1

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

Большое спасибо всем вам !!

0 голосов
/ 08 января 2010

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

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

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

UPDATE yourtable SET yourcol=regexp_replace(...)
0 голосов
/ 08 января 2010

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

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

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

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

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

replace(replace(replace(reverse(f), '3', '3.'), '2', '2.'), '1', '1.')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...