簡體   English   中英

如何在 MySQL 中按元素應用 json_extract?

[英]How do I apply json_extract element-wise in MySQL?

我有一列 json,我想從中提取一個特定的值。 但是,此值位於兩個不同的關鍵字下,即特性或特性。 我有這樣的事情:

+-----------------------+
|  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 似乎只適用於一個定義的路徑,並且似乎不接受變量作為路徑。

一種選擇是使用13.5 Prepared Statements

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

這個值位於兩個不同的關鍵字下,要么是'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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM