Могу ли я использовать псевдоним или const в качестве ключа JSON для функции JSON_EXTRACT - PullRequest
0 голосов
/ 31 января 2019

Я бы хотел узнать, есть ли способ использовать const или псевдоним в качестве ключа для извлечения данных JSON.Например, у нас есть json как это в нашей БД.

{
"key1": "value1",
"key2": "value"
}    

, тогда мы можем получить значение1 как

col->>'$.key'

или

JSON_EXTRACT(col, '$.key')

Но что еслимне нужно добиться этого, используя значение, которое входит в подзапрос?

@X =: "key1"
//or
SELECT data FROM table AS x

Я трачу, как на дерево нашего alredy, но я не понимаю, как заставить его работать, как

JSON_EXTRACT(col, @X)

Все получает только "Неверное выражение пути JSON"

Я пробовал использовать CONCAT и другие escape-символы, но все равно та же ошибка

Ответы [ 2 ]

0 голосов
/ 31 января 2019
mysql> select json_extract('{"key1": "value1","key2": "value"} ','$.key2') AS foo ;
                                                                 ^^^^^^^^
+---------+
| foo     |
+---------+
| "value" |
+---------+
1 row in set (0.00 sec)

С пользовательской переменной:

mysql> set @X := 'key2' ;
Query OK, 0 rows affected (0.00 sec)

mysql> select json_extract('{"key1": "value1","key2": "value"} ',CONCAT('$.',@X)) AS foo ;
                                                                 ^^^^^^^^^^^^^^^
+---------+
| foo     |
+---------+
| "value" |
+---------+
1 row in set (0.00 sec)

или

mysql> set @X := '$.key2' ;
Query OK, 0 rows affected (0.00 sec)

mysql> select json_extract('{"key1": "value1","key2": "value"} ',@X) AS foo ;
                                                                 ^^  
+---------+
| foo     |
+---------+
| "value" |
+---------+
1 row in set (0.00 sec)

извлечение значения ключа из запроса в виде встроенного представления:

mysql> select json_extract('{"key1": "value1","key2": "value"} ',CONCAT('$.',t.bar)) AS foo
    -> from ( select 'key2' AS bar ) t ;
+---------+
| foo     |
+---------+
| "value" |
+---------+
1 row in set (0.00 sec)

Встроенное представление может быть присоединено к фактической таблице, из которой мы получаем json:

 SELECT JSON_EXTRACT(s.jsoncol, CONCAT('$.',k.bar)) AS foo
   FROM mytable s
  CROSS
   JOIN ( SELECT 'key2' AS bar ) k
0 голосов
/ 31 января 2019

Вам нужно объединить $. в значение, которое вы извлекли.

JSON_EXTRACT(col, CONCAT('$.', @X))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...