SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 05.10.2011 15:00:09

smilena
Участник
Зарегистрирован: 05.10.2011
Сообщений: 3

Селект для выбора значений, разделеннных пробелом, из строки

Доброго дня!

Помогите, пожалуйста, с запросом к БД Nagios
Есть вот такие данные
host_id            service_id              performance_data
101                 201                      load1=0.000s;5.000;10.000;0; load5=0.000s;4.000;6.000;0; load15=0.000s;3.000;4.000;0;
102                 202                      users=0;20;50;0
101                 203                      /=1324MB;6968;7839;0;8710
...                   ...                        ...


performance_data представляет собой текстовую строку и имеет следующий формат:
'label1'=value[UOM];[warn];[crit];[min];[max]; пробел 'label2'=value[UOM];[warn];[crit];[min];[max]; ...
UOM - единица измерения
лейблов может быть от 1 до, к примеру, 10

Нужно распарсить эти строки и получить следующую выборку
param_id     host_id            service_id              label              value             warn       crit        min       max
01             101                 201                      load1             0.000             5.000      10.000   0
02             101                 201                      load5             0.000             4.000      6.000     0
03             101                 201                      load15            0.000             3.000      4.000     0
04             102                 202                      users             0                   20           50         0
05             101                 203                      /                   1324              6968        7839      0         8710
... и т.д.

Итого нужно:
1. Разбить performance_data на строки (разделитель пробел), сформировать из них столбец
2. Разбить каждую строку на столбцы label, value, warn, crit, min, max, (разделители ; и =  ) и отрезать единицу измерения, если она есть
3. Пронумеровать строки (присвоить уникальный ключ) - param_id - что-то наподобие row_number в Oracle

Неактивен

 

#2 05.10.2011 16:09:01

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: Селект для выбора значений, разделеннных пробелом, из строки

Нужно создать новую таблицу с новой структурой и переливать туда данные в новом формате.
Переливать по принципу INSERT INTO ... SELECT

load1=0.000s;5.000;10.000;0; load5=0.000s;4.000;6.000;0; load15=0.000s;3.000;4.000;0;
Распарсить эту гадость можно с помощью функций REPLACE и SUBSTRING_INDEX

Если не справитесь, напишите.

Неактивен

 

#3 06.10.2011 15:04:31

smilena
Участник
Зарегистрирован: 05.10.2011
Сообщений: 3

Re: Селект для выбора значений, разделеннных пробелом, из строки

evgeny, спасибо! SUBSTRING_INDEX мне помог чтобы разбить один лейбл на стобцы
вот что получилось (вместо users=0;20;50;0 соответственно любая строка из perfomance_data):

select substring_index(concat(replace('users=0;20;50;0','=',';'),';'),';',1) as label,
substring_index(substring_index(concat(replace('users;0;20;50;0','=',';'),';'),';',2),';',-1) as value,
substring_index(substring_index(concat(replace('users;0;20;50;0','=',';'),';'),';',3),';',-1) as warn,
substring_index(substring_index(concat(replace('users;0;20;50;0','=',';'),';'),';',4),';',-1) as crit,
substring_index(substring_index(concat(replace('users;0;20;50;0','=',';'),';'),';',5),';',-1) as min,
substring_index(substring_index(concat(replace('users;0;20;50;0','=',';'),';'),';',6),';',-1) as max

но вот задача как разбить вот это load1=0.000s;5.000;10.000;0; load5=0.000s;4.000;6.000;0; load15=0.000s;3.000;4.000;0; на 3 разных строки осталась... и я ума не приложу что с этим делать

Неактивен

 

#4 06.10.2011 15:08:48

smilena
Участник
Зарегистрирован: 05.10.2011
Сообщений: 3

Re: Селект для выбора значений, разделеннных пробелом, из строки

по поводу создания новой таблицы, можно ли сделать ее динамической?
чтобы запрос выполнялся по заданному расписанию и обновлял значение value, а также добавлял новые строки для лейблов, если они появляются в исходных таблицах?

Неактивен

 

#5 06.10.2011 23:25:59

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: Селект для выбора значений, разделеннных пробелом, из строки

по поводу создания новой таблицы, можно ли сделать ее динамической?
чтобы запрос выполнялся по заданному расписанию и обновлял значение value, а также добавлял новые строки для лейблов, если они появляются в исходных таблицах?

Угу

но вот задача как разбить вот это load1=0.000s;5.000;10.000;0; load5=0.000s;4.000;6.000;0; load15=0.000s;3.000;4.000;0; на 3 разных строки осталась... и я ума не приложу что с этим делать

Ну что тут делать ... Перепарсивать ещё раз, по второму кругу.
Резать по словам load
А вообще если сильно замaрачиваетесь, то наверно проще сделать STORE PROCEDURE

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson