powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Поиск вождения в строке по регулярному выражению
8 сообщений из 8, страница 1 из 1
Поиск вождения в строке по регулярному выражению
    #40058459
Semen Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте всем!

Имеем DB2 9.7.

Есть табличка со строковым полем. В этом поле хранятся телефонные номера. Но записаны они там в неформатированом виде. Примеры могут быть раличными: "Т.+79111111111", "89111111111 Это у Васи", "8(912)1111111", "89111111111, 79222222222", "8-912-1111111" и т.д.

Задача: Максимально вытащить эти номера и при возможности записать в виде 7NNNNNNNNNN.

Насколько задача выполнима?
Мысль пришла использовать регулярные выражения. Но как с ними дружит DB2 9.7 и с помощью каких функций это сделать?


Буду признателен за помощь
С уважением, Семен Попов
...
Рейтинг: 0 / 0
Поиск вождения в строке по регулярному выражению
    #40058492
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Semen Popov,

Добрый день.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
WITH MYTAB (NUM) AS
(
VALUES
  'Т.+79111111111'
, '89111111111 Это у Васи'
, '8(912)1111111'
, '89111111111'
, '79222222222'
, '8-912-1111111'
)
SELECT 
  NUM
, xmlcast
(
  xmlquery
  (
    'fn:replace($s, "^8", "7")' 
    passing 
      xmlcast(xmlquery('fn:replace($s, "[^\d]", "")' passing T.NUM  as "s") as varchar(4000))  
    as "s"
  ) as varchar(4000)
) NUM_NEW
FROM MYTAB T;




Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
|NUM                   |NUM_NEW    |
|----------------------|-----------|
|Т.+79111111111        |79111111111|
|89111111111 Это у Васи|79111111111|
|8(912)1111111         |79121111111|
|89111111111           |79111111111|
|79222222222           |79222222222|
|8-912-1111111         |79121111111|
...
Рейтинг: 0 / 0
Поиск вождения в строке по регулярному выражению
    #40058520
Semen Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark Barinstein, спасибо большое. Очень помогли. Идею понял - удаляете все не цифры, а затем первую восьмерку заменяете на 7. Для тех примеров, которые я привел сработает. Но есть случаи, в значениях которых есть ошибки. Например, пользователь ввел 12 цифр вместо 11 ("890123456789"), или наоборот ввел меньше циф ("8901234567"), или просто введен короткий городской телефон из 6 цифр ("333-22-11"). Такие случаи должны быть выданы без преобразования, как есть. То есть нас интересуют только сотовые телефоны - начинаются с "79" или "89" и имеют длину 11 цифр
...
Рейтинг: 0 / 0
Поиск вождения в строке по регулярному выражению
    #40058529
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Semen Popov,

Можно так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
WITH MYTAB (NUM) AS
(
VALUES
  'Т.+79111111111'
, '89111111111 Это у Васи'
, '8(912)1111111'
, '89111111111'
, '79222222222'
, '8-912-1111111'
, '223322 Это у Васи'
)
SELECT 
  NUM
, CASE WHEN SUBSTR(NUM_NEW, 1, 2) = '79' AND LENGTH(NUM_NEW) = 11 THEN NUM_NEW ELSE NUM END NUM_NEW
FROM
(
SELECT 
  NUM
, xmlcast
(
  xmlquery
  ('fn:replace($s, "^8", "7")' 
    passing 
      xmlcast(xmlquery('fn:replace($s, "[^\d]", "")' passing T.NUM  as "s") as varchar(4000))  
    as "s"
  ) as varchar(4000)
) NUM_NEW
FROM MYTAB T
) T;



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
|NUM                   |NUM_NEW          |
|----------------------|-----------------|
|Т.+79111111111        |79111111111      |
|89111111111 Это у Васи|79111111111      |
|8(912)1111111         |79121111111      |
|89111111111           |79111111111      |
|79222222222           |79222222222      |
|8-912-1111111         |79121111111      |
|223322 Это у Васи     |223322 Это у Васи|
...
Рейтинг: 0 / 0
Поиск вождения в строке по регулярному выражению
    #40058538
Semen Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark Barinstein, премного благодарен. А теперь для повышения уровня знаний спрошу. Есть ли в SQL/PL DB2 9.7 какой-нибудь примитивный инструмент поиска по регулярным выражениям?
...
Рейтинг: 0 / 0
Поиск вождения в строке по регулярному выражению
    #40058545
Semen Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Semen Popov
Mark Barinstein, премного благодарен. А теперь для повышения уровня знаний спрошу. Есть ли в SQL/PL DB2 9.7 какой-нибудь примитивный инструмент поиска по регулярным выражениям?
Может какую-нибудь свою функцию написать?
...
Рейтинг: 0 / 0
Поиск вождения в строке по регулярному выражению
    #40058562
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Semen Popov
Есть ли в SQL/PL DB2 9.7 какой-нибудь примитивный инструмент поиска по регулярным выражениям?
В конце страницы Regular expressions есть список функций, которые могут эти выражения использовать:

fn:matches - поиск
fn:replace - замена (именно ее испольовали выше)
fn:tokenize - разбиение строки на токены
...
Рейтинг: 0 / 0
Поиск вождения в строке по регулярному выражению
    #40058575
Semen Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark Barinstein, спасибо большое
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Поиск вождения в строке по регулярному выражению
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]