Гость
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Динамическая обработка json строки / 8 сообщений из 8, страница 1 из 1
23.09.2019, 11:15
    #39865489
hysgvarna
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическая обработка json строки
CREATE DEFINER=`ххх`@`ххх` PROCEDURE `Name_Template`(id_product char(11), ArrayParametr json)
BEGIN #собирает параметры продукта в одной строке

#строка json для проверки [{"param": "WLL"}, {"param": "L"}, {"param": "A"}]

declare l INT unsigned;
declare i INT unsigned; # только положительные значения
declare val char(11);
declare val1 char(50);

SET l = JSON_LENGTH(ArrayParametr); #узнаем длиину массива начиная с единицы
SET i = 0;

WHILE i < l DO
SET val = TRIM(BOTH '"' FROM JSON_EXTRACT(ArrayParametr, CONCAT('$[', i, '].param')));
SET @t2 = CONCAT("SELECT ", val, " FROM Price where Price.ProductId=", id_product);
SET i := i + 1; #приращение счетчика
END WHILE;

PREPARE stmt3 FROM @t2;
EXECUTE stmt3;
DEALLOCATE PREPARE stmt3;

END


В данном случае выводится только последний параметр json строки. Подскажите как вывести все параметры в одной строке типа char, учитывая, что длинна массива json строки - динамическая.
...
Рейтинг: 0 / 0
23.09.2019, 12:01
    #39865513
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическая обработка json строки
Код: sql
1.
2.
3.
4.
SELECT GROUP_CONCAT(param) params
FROM JSON_TABLE( '[{"param": "WLL"}, {"dummy": "L"}, {"param": "L"}, {"param": "A"}]',
                 "$[*]" COLUMNS( param VARCHAR(254) PATH "$.param" )
               ) AS jsontable;
...
Рейтинг: 0 / 0
23.09.2019, 13:11
    #39865582
hysgvarna
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическая обработка json строки
Akina,

Странно, почему-то ошибку синтаксиса выдает

SELECT GROUP_CONCAT(param) params
FROM JSON_TABLE( '[{"param": "WLL"}, {"dummy": "L"}, {"param": "L"}, {"param": "A"}]',
"$[*]" COLUMNS( param VARCHAR(254) PATH "$.param" )
) AS jsontable;


Все что после from, не могу понять почему.
...
Рейтинг: 0 / 0
23.09.2019, 13:25
    #39865600
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическая обработка json строки
Нормально всё с синтаксисом.
fiddle

hysgvarnaошибку синтаксиса выдает
Где цитата ошибки? или её нужно придумать самостоятельно?

hysgvarnaВсе что после from, не могу понять почему.
На всякий случай - версия сервера какая?
...
Рейтинг: 0 / 0
23.09.2019, 13:30
    #39865607
hysgvarna
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическая обработка json строки
Akina,

Ну я тупо даже скомпилировать не могу в Workbench.
Версия 5.7.27-0ubuntu0.16.04.1
...
Рейтинг: 0 / 0
23.09.2019, 13:33
    #39865609
hysgvarna
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическая обработка json строки
hysgvarna,

Есть какая-нибудь альтернатива для моей версии?
...
Рейтинг: 0 / 0
23.09.2019, 15:05
    #39865709
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическая обработка json строки
Если я верно понимаю задачу, то

Код: 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.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
DROP PROCEDURE IF EXISTS Name_Template;

DELIMITER @;

CREATE PROCEDURE `Name_Template`(id_product char(11), ArrayParametr json)
BEGIN -- собирает параметры продукта в одной строке

-- строка json для проверки [{"param": "WLL"}, {"param": "L"}, {"param": "A"}]

declare l INT unsigned;
declare i INT unsigned; -- только положительные значения
declare val char(11);
declare val1 char(50);

SET l = JSON_LENGTH(ArrayParametr); -- узнаем длиину массива начиная с единицы
SET i = 0;
SET @t2='';

WHILE i < l DO
    SET val = TRIM(BOTH '"' FROM JSON_EXTRACT(ArrayParametr, CONCAT('$[', i, '].param')));
    -- SET @t2 = CONCAT("SELECT ", val, " FROM Price where Price.ProductId=", id_product);
    SET @t2:=CONCAT(@t2,',',val);
    SET i := i + 1; -- приращение счетчика
END WHILE;

SET @t2:=CONCAT("SELECT ", TRIM(LEADING "," FROM @t2), " FROM Price where Price.ProductId=", id_product);

-- PREPARE stmt3 FROM @t2;
-- EXECUTE stmt3;
-- DEALLOCATE PREPARE stmt3;
SELECT @t2;

END;
@;
DELIMITER ;

CALL Name_Template(123456, '[{"param": "WLL"}, {"param": "L"}, {"param": "A"}]');

-- DROP PROCEDURE IF EXISTS Name_Template;
...
Рейтинг: 0 / 0
24.09.2019, 10:28
    #39866108
hysgvarna
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическая обработка json строки
Akina,

Цель задачи была в формирования имени по шаблону(у разных групп товаров будет разный шаблон для вывода параметров)


CREATE DEFINER=`xxx`@`xxx` PROCEDURE `Name_Template`(id_product char(11), ArrayParametr json)
BEGIN -- собирает параметры продукта в одной строке

-- строка json для проверки [{"param": "WLL"}, {"param": " "}, {"param": "L"}, {"param": "-"}, {"param": "A"}]

declare l INT unsigned;
declare i INT unsigned; -- только положительные значения
declare val char(11);
declare val1 char(50);

SET l = JSON_LENGTH(ArrayParametr); -- узнаем длину массива начиная с единицы
SET i = 0;
SET @t2='';

WHILE i < l DO

if mod(i, 2) = 0 #добавляем выбранные символы между значениями (в них не убираем кавычки)
THEN
SET val = TRIM(BOTH '"' FROM JSON_EXTRACT(ArrayParametr, CONCAT('$[', i, '].param')));
ELSE
SET val = JSON_EXTRACT(ArrayParametr, CONCAT('$[', i, '].param'));
END if;

SET @t2 := CONCAT(@t2, ',', val);
SET i := i + 1; -- приращение счетчика
END WHILE;

SET @t2 := CONCAT("SELECT ", "concat(", TRIM(LEADING "," FROM @t2), ")", " FROM Price where Price.ProductId=", id_product); #собираем строку и удаляем первую запятую

PREPARE stmt3 FROM @t2; #выполняем собранную строку
EXECUTE stmt3;
DEALLOCATE PREPARE stmt3;
-- SELECT @t2;

END


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


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