#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’, ‘ в строке 12. это действительно работает @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 да, видел этот комментарий. Иногда вам нужно повеселиться.