Гость
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Поиск вождения в строке по регулярному выражению / 8 сообщений из 8, страница 1 из 1
31.03.2021, 12:27
    #40058459
Semen Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск вождения в строке по регулярному выражению
Здравствуйте всем!

Имеем DB2 9.7.

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

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

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


Буду признателен за помощь
С уважением, Семен Попов
...
Рейтинг: 0 / 0
31.03.2021, 13:39
    #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
31.03.2021, 14:30
    #40058520
Semen Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск вождения в строке по регулярному выражению
Mark Barinstein, спасибо большое. Очень помогли. Идею понял - удаляете все не цифры, а затем первую восьмерку заменяете на 7. Для тех примеров, которые я привел сработает. Но есть случаи, в значениях которых есть ошибки. Например, пользователь ввел 12 цифр вместо 11 ("890123456789"), или наоборот ввел меньше циф ("8901234567"), или просто введен короткий городской телефон из 6 цифр ("333-22-11"). Такие случаи должны быть выданы без преобразования, как есть. То есть нас интересуют только сотовые телефоны - начинаются с "79" или "89" и имеют длину 11 цифр
...
Рейтинг: 0 / 0
31.03.2021, 14:57
    #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
31.03.2021, 15:05
    #40058538
Semen Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск вождения в строке по регулярному выражению
Mark Barinstein, премного благодарен. А теперь для повышения уровня знаний спрошу. Есть ли в SQL/PL DB2 9.7 какой-нибудь примитивный инструмент поиска по регулярным выражениям?
...
Рейтинг: 0 / 0
31.03.2021, 15:11
    #40058545
Semen Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск вождения в строке по регулярному выражению
Semen Popov
Mark Barinstein, премного благодарен. А теперь для повышения уровня знаний спрошу. Есть ли в SQL/PL DB2 9.7 какой-нибудь примитивный инструмент поиска по регулярным выражениям?
Может какую-нибудь свою функцию написать?
...
Рейтинг: 0 / 0
31.03.2021, 15:35
    #40058562
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск вождения в строке по регулярному выражению
Semen Popov
Есть ли в SQL/PL DB2 9.7 какой-нибудь примитивный инструмент поиска по регулярным выражениям?
В конце страницы Regular expressions есть список функций, которые могут эти выражения использовать:

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


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