MySQL 8 поиск JSON ключ по значению в массиве - PullRequest
1 голос
/ 10 февраля 2020

У меня есть MySQL таблица с полем JSON, где я храню данные в таком формате.

{
  "fields": {
    "1": {
      "s": "y"
    },
    "2": {
      "s": "n"
    }
  }
}

Мне нужно получить ключи в fields, например, 1 или 2 учитывая значение s.

Пример запроса:

create table mytable ( mycol json );

insert into mytable set mycol = '{"fields": {"1": {"s": "y"},"2": {"s": "n"}}}';


select j.* from mytable, JSON_TABLE(mycol,
'$.fields.*' COLUMNS (
    json_key VARCHAR(10) PATH '$',
    s VARCHAR(10) PATH '$.s'
  )
) AS j where j.s = 'y';

дает:

# json_key, s
null, y

Я ожидал бы получить

# json_key, s
1, y

Возможно ли получить эти данные как-нибудь?

Мне не нужны результаты в формате row / table. Я был бы рад получить список идентификаторов (json_keys), разделенных запятыми, которые соответствуют моему критерию.

РЕДАКТИРОВАТЬ: я также думал о получении путей с использованием JSON_SEARCH и передачи его в JSON_EXTRACT, это было достигнуто здесь: Объединение JSON_SEARCH и JSON_EXTRACT дает мне: «Неверное JSON выражение пути.» К сожалению, разница в том, что мне нужно было бы использовать JSON_SEARCH в режиме all, так как мне нужны все результаты. В таком режиме JSON_SEARCH возвращает список путей, где JSON_EXTRACT принимает список аргументов.

1 Ответ

1 голос
/ 18 февраля 2020

Попробуйте FOR ORDINALITY (см. 12.17.6 JSON Табличные функции ), этот тип перечисляет строки в предложении COLUMNS:

SELECT
  JSON_UNQUOTE(
    JSON_EXTRACT(
      JSON_KEYS(`mycol` ->> '$.fields'),
      CONCAT('$[', `j`.`row` - 1, ']')
    )
  ) `json_key`,
  `j`.`s`
FROM
  `mytable`,
  JSON_TABLE(
    `mycol`,
    '$.fields.*' COLUMNS (
      `row` FOR ORDINALITY,
      `s` VARCHAR(10) PATH '$.s'
  )
) `j`
WHERE
  `j`.`s` = 'y';

См. dbfiddle .

...