sql >> Database teknologi >  >> RDS >> Mysql

Få forskellige værdier fra MySQL JSON-array

Beklager nekromancing, men jeg har stødt på lignende problem. Løsningen er:JSON_TABLE() tilgængelig siden MySQL 8.0.

Først skal du flette arrays i rækker til én række enkelt array.

select concat('[',         -- start wrapping single array with opening bracket
    replace(
        replace(
            group_concat(vals),  -- group_concat arrays from rows
            ']', ''),            -- remove their opening brackets
        '[', ''),              -- remove their closing brackets
    ']') as json             -- finish wraping single array with closing bracket
from (
  select '[801, 751, 603, 753, 803]' as vals
  union select '[801, 751]'
  union select '[578, 66, 15]'
) as jsons;

# gives: [801, 751, 603, 753, 803, 801, 751, 578, 66, 15]

For det andet, brug json_table for at konvertere arrayet til rækker.

select val
from (
    select concat('[',
        replace(
            replace(
                group_concat(vals),
                ']', ''),
            '[', ''),
        ']') as json
    from (
      select '[801, 751, 603, 753, 803]' as vals
      union select '[801, 751]'
      union select '[578, 66, 15]'
    ) as jsons
) as merged
join json_table(
    merged.json,
    '$[*]' columns (val int path '$')
) as jt
group by val;

# gives...
801
751
603
753
803
578
66
15

Se https://dev. mysql.com/doc/refman/8.0/da/json-table-functions.html#function_json-table

Bemærk group by val for at få forskellige værdier. Du kan også order dem og alt muligt...

Eller du kan bruge group_concat(distinct val) uden group by direktiv (!) for at få et-line resultat.

Eller endda cast(concat('[', group_concat(distinct val), ']') as json) for at få et ordentligt json-array:[15, 66, 578, 603, 751, 753, 801, 803] .

Læs mine Bedste praksis for at bruge MySQL som JSON-lager :)




  1. MySQL COUNT med LIMIT

  2. SQL Server 2019 nye funktioner

  3. Ligesom Case Sensitive i MySQL

  4. Sammenligning af Oracle RAC HA-løsning med Galera Cluster til MySQL eller MariaDB