sql >> Databáze >  >> RDS >> Mysql

Získejte klíče Json v MySQL pro konkrétní hodnotu

Jak jsem řekl, může to být problém analyzovat JSON v MySQL, protože se zde zabýváte textovými klíči.
Budete tedy muset použít JSON_KEYS() pro jejich získání v kombinaci s generátorem čísel se vygeneruje dynamická cesta JSON, která se použije v JSON_EXTRACT()

Funkce 8 MySQL JSON_TABLE() dělá to mnohem jednodušší..

Dotaz

 SELECT
  JSON_UNQUOTE(
    JSON_EXTRACT(json ,  CONCAT('$.', SUBSTRING_INDEX(
       SUBSTRING_INDEX(json_parsed, ',', number_generator.number)
       , ','
       , -1
     ), '.name'))) AS name
FROM (

  SELECT 
   @row := @row + 1 AS number
  FROM (
    SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION   SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
  ) row1
  CROSS JOIN (
    SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION  SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
  ) row2
  CROSS JOIN (
    SELECT @row := 0 
  ) init_user_params 
) AS number_generator
CROSS JOIN (

    SELECT  
        SUBSTRING(json_keys, 2, json_keys_length - 2) AS json_parsed
      , json_keys
      , json
      , JSON_LENGTH(json_keys) AS json_array_length                       
    FROM (
       SELECT 
            JSON_KEYS(record.json) AS json_keys
          , json
          , LENGTH(JSON_KEYS(record.json)) AS json_keys_length
       FROM (
          SELECT 
             '{
                "Intitule": {
                   "name": "Intitule de la formation",
                   "stats": false,
                   "is_array": false,
                   "is_filter": true,
                   "chart": "pie",
                   "col": "6"
                },
                "Fin": {
                    "name": "Date de fin",
                    "stats": false,
                    "is_array": false,
                    "is_filter": false,
                    "chart": "pie",
                    "col": "6"
                    }
                }' AS json
          FROM  
            DUAL  
       ) AS record                     
    ) AS json_information  
  ) AS json_init
WHERE
   number_generator.number BETWEEN 0 AND json_array_length
 AND
   JSON_EXTRACT(json ,  CONCAT('$.', SUBSTRING_INDEX(
     SUBSTRING_INDEX(json_parsed, ',', number_generator.number)
     , ','
     , -1
   ), '.is_filter')) = true 

Výsledek

| name                     |
| ------------------------ |
| Intitule de la formation |

viz ukázka



  1. php include chyba nenalezení cesty

  2. Vytvořte objekt DIE na serveru SQL Server

  3. Pochopení toho, co sp_updatestats skutečně aktualizuje

  4. Laravel SQLSTATE[22007]:Neplatný formát data a času:1292 Nesprávná hodnota data a času:'2019-03-10 02:00:39' pro sloupec 'updated_at' (letní čas?)