SQL-запрос для печати части строкового значения - PullRequest
0 голосов
/ 23 апреля 2019

У меня есть текстовое поле в таблице MySQL 5.6, которая состоит из строкового представления JSON.Такие JSON существуют в поле «клиенты» с массивом идентификаторов, например:

{
    ...
    "clients":[1,2,3],
    ...
}

Как написать SQL-запрос, который печатает именно эту часть текста из JSON для каждой записи, например:

clients
-----------------
"clients":[1,2,3]
"clients":[4,5]
...

Должен ли я использовать какое-то регулярное выражение или это можно сделать проще?

Спасибо!

ОБНОВЛЕНИЕ : JSON_EXTRACT не работает для MySQL 5.6

Ответы [ 3 ]

4 голосов
/ 23 апреля 2019

Не используйте регулярное выражение для анализа JSON, вместо этого используйте функцию JSON_EXTRACT:

SELECT JSON_EXTRACT(json, "$.clients")
FROM yourTable;

Демо

Использование регулярных выражений для анализа JSON, как правило, плохая идея, если нет альтернативы.В этом случае более поздние версии MySQL предлагают JSON API, который может удовлетворить ваши требования.

1 голос
/ 23 апреля 2019

Должен быть обработан из SQL?Я думаю, что это более рационально для обработки вне SQL-сервера.Или вы можете обновить MySQL до 5.7.8+ и использовать JSON_EXTRACT.Все остальное будет БОЛЬШОЙ костыль.

1 голос
/ 23 апреля 2019

Ну, я настоятельно рекомендую обновить, этот запрос больше предназначен для развлечения.

Запрос

SELECT 
 DISTINCT 
  SUBSTRING_INDEX(
    SUBSTRING_INDEX(
        records.cvs
      , ','
      , number_generator.number
    )
    , ','
    , -1
  ) array_part
FROM (
 SELECT 
 @row := @row + 1 AS number
FROM (
  SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
) row1
CROSS JOIN (
  SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
) row2
CROSS JOIN (
  SELECT @row := 0 
) init_user_params 
) AS number_generator
CROSS JOIN (


SELECT 
  # parse out the 1,2,3 part from  [1,2,3] part
  SUBSTRING (
     # parse out the [1,2,3] part
     SUBSTRING(
         records.json
       , (LOCATE(':', records.json) + 1)
     )
   , 2 
   , LENGTH(
      # parse out the [1,2,3] part
      SUBSTRING(
         records.json
       , (LOCATE(':', records.json) + 1)
       )
     ) - 2
 ) AS cvs
FROM (
  SELECT  
    '"clients":[1,2,3]' AS json
) AS records

) AS records

Результат

| array_part |
| ---------- |
| 1          |
| 2          |
| 3          |

см. демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...