Как применить json_extract поэлементно в MySQL? - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть столбец jsons, и я хотел бы извлечь из него одно конкретное значение. Однако это значение находится под двумя разными ключевыми словами: либо функция, либо функция. У меня есть что-то вроде этого:

+-----------------------+
|  Json          id     |
+-----------------------+
| {feature: 1}   123    |
| {features: 2}  223    |
| {feature: 3}   323    |
| {features: 4}  423    |
+-----------------------+

, и я хочу что-то вроде этого:

+-----------------------+
|  features      id     |
+-----------------------+
|     1          123    |
|     2          223    |
|     3          323    |
|     4          423    |
+-----------------------+

Как я могу применить json_extract к каждой строке, чтобы получить желаемое значение? Я пробовал

SELECT json_extract(json, path) FROM tbl

, но json_extract, кажется, работает только для одного определенного пути и, кажется, не принимает переменные в качестве пути.

Ответы [ 2 ]

0 голосов
/ 04 апреля 2020

это значение находится под двумя разными ключевыми словами: либо 'feature', либо 'features'.

. Если у вас есть предопределенный список возможных ключей, вы можете попробовать их по одному один и используйте coalesce() для выбора:

select coalesce(js ->> '$.feature', js ->> '$.features') feature, id
from mytable

Демонстрация на DB Fiddle :

feature |  id
:------ | --:
1       | 123
2       | 223
3       | 323
4       | 423
0 голосов
/ 04 апреля 2020

Один из вариантов - использовать 13,5 подготовленных заявлений :

SET
  @`path` := 'feature';

SET
  @`qry` := CONCAT('
    SELECT
      JSON_EXTRACT(`json`, \'$.', @`path`, '\') ', @`path`, ',
      `id`
    FROM
      `tbl`;
  ');

PREPARE `stmt` FROM @`qry`;
EXECUTE `stmt`;
DEALLOCATE PREPARE `stmt`;

См. dbfiddle .

ОБНОВЛЕНИЕ

SET
  @`path` := '\'$.feature\', \'$.features\'',
  @`alies` := 'features';

SET  @`qry` :=
  CONCAT('
    SELECT
      `der`.`', @`alies`,'` ->> \'$[0]\' `', @`alies`, '`,
      `der`.`id`
    FROM (
      SELECT
        JSON_EXTRACT(`json`, ', @`path`, ') `', @`alies`, '`,
        `id`
      FROM
        `tbl`
    ) `der`;
  ');

PREPARE `stmt` FROM @`qry`;
EXECUTE `stmt`;
DEALLOCATE PREPARE `stmt`;

См. dbfiddle .

...