Как выбрать значения из JSON в MySQL?

#mysql #json #mysql-5.7

#mysql #json #mysql-5.7

Вопрос:

кто-нибудь может сказать мне, что не так с этим запросом?

 DECLARE @json LONGTEXT;

SET @json = '[ { "name":"John Smith",  "address":"780 Mission St, San Francisco, CA 94103"}, { "name":"Sally Brown",  "address":"75 37th Ave S, St Cloud, MN 94103"}, { "name":"John Johnson",  "address":"1262 Roosevelt Trail, Raymond, ME 04071"}     ]';

##SELECT @json;

SELECT * FROM JSON_TABLE (@json, '$[*]' COLUMNS (
                name VARCHAR(40)  PATH '$.name',
                address VARCHAR(100) PATH '$.address'));
  

Ошибка, которую я получаю, это:

У вас ошибка в вашем синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса для использования рядом со СТОЛБЦАМИ ‘(@json, ‘$[*]’ (name VARCHAR(40) PATH ‘$.name’, ‘ в строке 1

Просто для информации я использую TOAD как инструмент для подключения к моему облачному экземпляру sql.

Комментарии:

1. Понятия не имею, вы получаете ошибку или вы не получаете ожидаемые результаты?

2. @RaymondNijland: Обновил вопрос.

3. проверьте мой ответ, я думаю, это поможет, как я уже говорил, вам нужно написать сложный код MySQL.

Ответ №1:

Во-первых, в mysql вам не нужно объявлять переменную, в данном случае. Просто используйте ключевое слово ‘SET’. И, наконец, вам нужно указать псевдоним для вашего запроса ‘select’. Вот так:

 SET @json = '[ { "name":"John Smith",  "address":"780 Mission St, San Francisco, CA 94103"}, { "name":"Sally Brown",  "address":"75 37th Ave S, St Cloud, MN 94103"}, { "name":"John Johnson",  "address":"1262 Roosevelt Trail, Raymond, ME 04071"}     ]';

##SELECT @json;

SELECT * FROM JSON_TABLE (@json, '$[*]' COLUMNS (
                `name` VARCHAR(40)  PATH '$.name',
                `address` VARCHAR(100) PATH '$.address')) AS T;
  

Комментарии:

1. У вас ошибка в вашем синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса для использования рядом со СТОЛБЦАМИ ‘(@json, ‘$[*]’ ( name VARCHAR(40) PATH ‘$.name’, ‘ в строке 1

2. это действительно работает @Sumit смотрите демо .. Если это ошибка. тогда вы не выполняете это в версии MySQL 8, и вам придется имитировать JSON_TABLE() функцию.

3. @RaymondNijland: да, ошибка связана с версией. Версия MySQL, которую я использую, равна 5.7, а JSON_TABLE работает в версии 8. Есть предложения, как мне заставить это работать в 5.7??

4. «Есть предложения, как мне заставить это работать в версии 5.7» Да, я мог бы @Sumit, но вам это не понравится, это предполагает написание сложного кода MySQL.

5. @RaymondNijland: моя главная проблема в том, что я хочу массово вставлять данные в свой sql с помощью C #. Это проблема, которую я хочу решить.

Ответ №2:

В идеале вы должны обновиться до MYSQL 8, этот ответ больше предназначен для развлечения

Вам нужно написать сложный SQL для имитации MySQL 8.0 JSON_TABLE() в версиях ниже MySQL 8

Запрос

 SET @json = '[ { "name":"John Smith",  "address":"780 Mission St, San Francisco, CA 94103"}, { "name":"Sally Brown",  "address":"75 37th Ave S, St Cloud, MN 94103"}, { "name":"John Johnson",  "address":"1262 Roosevelt Trail, Raymond, ME 04071"}     ]';

##SELECT @json;

SELECT * FROM JSON_TABLE (@json, '$[*]' COLUMNS (
                `name` VARCHAR(40)  PATH '$.name',
                `address` VARCHAR(100) PATH '$.address')) AS T;
  

Результат

 | name         | address                                 |
| ------------ | --------------------------------------- |
| John Smith   | 780 Mission St, San Francisco, CA 94103 |
| Sally Brown  | 75 37th Ave S, St Cloud, MN 94103       |
| John Johnson | 1262 Roosevelt Trail, Raymond, ME 04071 |
  

смотрите демо

Запрос MySQL 5.7 simulate / эмулировать включает в себя использование генератора чисел и нескольких встроенных функций JSON MySQL.

Запрос

 SELECT 
   REPLACE(JSON_EXTRACT(json_record.json, CONCAT('$[',number,'].name')), '"', '') AS name
 , REPLACE(JSON_EXTRACT(json_record.json, CONCAT('$[',number,'].address')), '"', '') AS address
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 := -1 
    ) init_user_params 
  ) AS number_generator
CROSS JOIN (
SELECT 
   JSON_LENGTH(json_information.json) - 1 AS json_length
 , json_information.json
FROM (
  SELECT 
    record.json
  FROM (
    SELECT 
      '
      [{
            "name": "John Smith",  
            "address": "780 Mission St, San Francisco, CA 94103"
      }, {
           "name": "Sally Brown",
           "address": "75 37th Ave S, St Cloud, MN 94103"
      }, {
           "name": "John Johnson",
           "address": "1262 Roosevelt Trail, Raymond, ME 04071"
      }]
     ' AS json
    FROM 
     DUAL   
  ) AS record  
) AS json_information

) AS json_record
WHERE 
 number BETWEEN 0 AND json_length           
  

Результат

 | name         | address                                 |
| ------------ | --------------------------------------- |
| John Smith   | 780 Mission St, San Francisco, CA 94103 |
| Sally Brown  | 75 37th Ave S, St Cloud, MN 94103       |
| John Johnson | 1262 Roosevelt Trail, Raymond, ME 04071 |
  

смотрите демо

Комментарии:

1. Откровенно говоря, проще перейти на MySQL 8.0.

2. Я должен согласиться с Биллом, но это хороший фрагмент кодирования.

3. «Я должен согласиться с Биллом, но это хороший фрагмент кода» @Nick спасибо, я также делаю обновление до MySQL 8 наиболее понятным, вы заметили -> «В идеале вы должны обновиться до MYSQL 8, этот ответ больше предназначен для развлечения»

4. @RaymondNijland да, видел этот комментарий. Иногда вам нужно повеселиться.