Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Подсчитать количество телефонов в столбце, если в одной строке их несколько.По разделителю / 8 сообщений из 8, страница 1 из 1
16.03.2018, 21:43
    #39616145
arelsom
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подсчитать количество телефонов в столбце, если в одной строке их несколько.По разделителю
Добрый вечер!
Подскажите новичку. Есть столбец phones, где хранятся данные формата: 89111111111[2], 89112222222[3].
в некоторых столбцах указан только один номер.

Задача у меня такая - необходимо подсчитать, сколько всего номеров, просто через count здесь не идёт.

И есть ли возможность подсчитать среднее значение того, что находится в квадратных скобках?

Если кто-то имел дело с подобным, прошу объяснить и показать как надо. Заранее благодарен!
...
Рейтинг: 0 / 0
16.03.2018, 23:44
    #39616171
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подсчитать количество телефонов в столбце, если в одной строке их несколько.По разделителю
Ну посчитай число зпт:

Код: plsql
1.
REGEXP_COUNT(phones,',') + 1


или

Код: plsql
1.
LENGTH(phones) - LENGTH(REPLACE(phones,',')) + 1



среднее значение того, что находится в квадратных скобках через XMLQUERY:

Код: plsql
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 t as (
           select  phones,
                   regexp_count(phones,',') + 1 phone_count,
                   case regexp_count(phones,'\[')
                     when 0 then '()'
                     else '(0' || regexp_replace(phones,'(^|\])[^[]*(\[|$)','+') || '0) div ' || regexp_count(phones,'\[')
                   end avg_expr
             from  phone
          )
select  phones,
        phone_count,
        xmlcast(
                xmlquery(
                         avg_expr
                         returning content
                        )
                as number
               ) average
  from  t
/

PHONES                                             PHONE_COUNT    AVERAGE
-------------------------------------------------- ----------- ----------
89111111111[2], 89112222222[3]                               2        2.5
89111111111[7], 89112222222[3],89113333333                   3          5
89111111111                                                  1
89111111111, 89112222222,89113333333[4]                      3          4

SQL> 



SY.
...
Рейтинг: 0 / 0
17.03.2018, 02:01
    #39616180
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подсчитать количество телефонов в столбце, если в одной строке их несколько.По разделителю
arelsom,

крайне нежелательно разделять телефонные номера через запятую или точку с запятой, т.к. запятая означает паузу и при указании рабочего телефона с внутренним номером указывают внешний номер мини-АТС и через запятую внутренний номер
...
Рейтинг: 0 / 0
20.03.2018, 18:04
    #39617739
arelsom
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подсчитать количество телефонов в столбце, если в одной строке их несколько.По разделителю
SY,
спасибо!
к сожалению, способ с regexp_count не работает, так как стоит oracle 10g.
Не знаете, какие ещё есть варианты? Не могу найти в интернете.
...
Рейтинг: 0 / 0
20.03.2018, 18:20
    #39617745
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подсчитать количество телефонов в столбце, если в одной строке их несколько.По разделителю
arelsomНе могу найти в интернете.Зачем ходить кругами? Так и скажи: "сделайте за меня".
...
Рейтинг: 0 / 0
20.03.2018, 19:48
    #39617805
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подсчитать количество телефонов в столбце, если в одной строке их несколько.По разделителю
arelsomк сожалению, способ с regexp_count не работает, так как стоит oracle 10g.
Не знаете, какие ещё есть варианты? Не могу найти в интернете.

И что, так трудно сообразить?

Код: plsql
1.
regexp_count(phones,',') = length(phones) - length(replace(phones,','))



Что кстати приведено в моем ответе который ты похоже прочел по-диагонали.

SY.
...
Рейтинг: 0 / 0
21.03.2018, 09:14
    #39617950
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подсчитать количество телефонов в столбце, если в одной строке их несколько.По разделителю
SY,

89008007060[1],,86007008090[3]
Если там изначально хрень, то почему бы и не такая.
...
Рейтинг: 0 / 0
21.03.2018, 14:08
    #39618212
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подсчитать количество телефонов в столбце, если в одной строке их несколько.По разделителю
env89008007060[1],,86007008090[3]
Если там изначально хрень, то почему бы и не такая.

Хрень должна отсекаться при вводе чтобы не тратить ресурсы каждый раз проверяя на хрень. Ну а так:

Код: plsql
1.
length(regexp_replace(phones,',*[^,]+,*','X'))



SY.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Подсчитать количество телефонов в столбце, если в одной строке их несколько.По разделителю / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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