Строковать массив JSON в MySQL

У меня есть столбец JSON в таблице. то есть стол

    column
---------------
[2,5,7,21,1,54,12]

Теперь его возвращаемый массив для приведенного ниже запроса.

select column from table

Выход => [2,5,7,21,1,54,12]

То, что я хочу, это вывод как «2,5,7,21,1,54,12».

Любое предложение?

Нормализуйте свою базу данных. Какой смысл хранить такие сериализованные данные?

Cid 27.04.2019 14:32

Вы можете использовать вложенные функции replace(), чтобы удалить [ и ], или вы можете использовать комбинацию SUBSTRING() и LENGTH(), см. демо, должно быть больше MySQL строковые функции, которые могут делать то же самое.

Raymond Nijland 27.04.2019 15:34

@Cid это для отчетности. Мне нужно получить его как строковый формат. Принимая во внимание, что когда данные вставляются, они должны быть в формате массива JSON.

surajit 27.04.2019 16:30

@RaymondNijland: Да, это последний вариант, который я могу придумать. Нет функции JSON для объединения элементов массива?

surajit 27.04.2019 16:31

Формат массива «Мне нужно получить его в формате stringify. Принимая во внимание, что когда данные вставляются, они должны быть в формате массива JSON» JSON всегда с [], а также звучит очень противоречиво с «Я хочу вывести как «2,5,7,21,1,54,12».»

Raymond Nijland 27.04.2019 16:33
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
2
5
6 109
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

$array = (result from column);

echo implode(",", $array); // separates array variables with a comma ",".

больше здесь:
https://www.php.net/manual/en/function.implode.php

я не заметил тег PHP в этом вопросе?

Raymond Nijland 27.04.2019 15:28
"был один, его удалили..." нет, тега PHP никогда не было, вопрос никогда не редактировался.
Raymond Nijland 27.04.2019 15:51

Я прокручивал теги php, возможно, я нажал «связанные» или что-то в этом роде. Приношу извинения за неудобства

Andrew 27.04.2019 15:54

Нет.. это не связано с PHP.. Но спасибо @Andrew за ответ. У меня есть бэкэнд как nodeJS, хотя я не хочу перебирать и изменять данные из бэкэнда. Скорее я хочу изменить его из SQL, если это возможно, а также не делать запрос дорогим.

surajit 27.04.2019 16:33
Ответ принят как подходящий

Вот пример запроса массива JSON:

select data from t;
+--------------------------+
| data                     |
+--------------------------+
| [2, 5, 7, 21, 1, 54, 12] |
+--------------------------+

Вы можете превратить массив JSON в строку, используя JSON_UNQUOTE(). Но он форматирует строку с квадратными скобками и пробелами:

select json_unquote(data) as stringified from t;
+--------------------------+
| stringified              |
+--------------------------+
| [2, 5, 7, 21, 1, 54, 12] |
+--------------------------+

Вы можете удалить эти нежелательные символы с помощью ЗАМЕНЯТЬ():

select replace(replace(replace(json_unquote(data), ' ', ''), '[', ''), ']', '') as stringified from t;
+------------------+
| stringified      |
+------------------+
| 2,5,7,21,1,54,12 |
+------------------+

В MySQL 8.0 вы можете заменить символы за один вызов REGEXP_REPLACE():

select regexp_replace(json_unquote(data), '[\\[\\] ]', '') as stringified from t;
+------------------+
| stringified      |
+------------------+
| 2,5,7,21,1,54,12 |
+------------------+

Элегантное решение — использовать возможности JSON_TABLE() и MySQL GROUP_CONCAT().

С таким образцом данных:

+--------+--------------------------------------------------------------------+
| user   | emails (JSON)                                                      |
+--------+--------------------------------------------------------------------+
| user-1 | ["[email protected]", "[email protected]", "[email protected]"] |
| user-2 | ["[email protected]"]                                             |
| user-3 | ["[email protected]", "[email protected]"]                       |
+--------+--------------------------------------------------------------------+

Если мы хотим вывести:

+--------+----------------------------------------------------------------+
| user   | emails (TEXT)                                                  |
+--------+----------------------------------------------------------------+
| user-1 | [email protected] // [email protected] // [email protected] |
| user-2 | [email protected]                                             |
| user-3 | [email protected] // [email protected]"                      |
+--------+----------------------------------------------------------------+

Мы можем сделать :

WITH data_sample (user, emails) AS (
  -- Fake data build to test query
  VALUES 
    ROW ('user-1', JSON_ARRAY('[email protected]', '[email protected]', '[email protected]')),
    ROW ('user-2', JSON_ARRAY('[email protected]')),
    ROW ('user-3', JSON_ARRAY('[email protected]', '[email protected]'))
)
SELECT ALL user, GROUP_CONCAT(email SEPARATOR ' // ') AS emails
FROM data_sample
CROSS JOIN JSON_TABLE(emails, '$[*]' COLUMNS (email TINYTEXT PATH '$')) AS _
GROUP BY user;

Другие вопросы по теме