Search code examples
mysqlmysql-8.0mysql-json

Concatenate JSON array to string


I have the following result, which are JSON arrays:

["elative degree of كَبِير‎ (kabīr):", "greater; greatest"]
["elative degree of كَبِير‎ (kabīr):", "bigger, larger; biggest, largest"]
["elative degree of كَبِير‎ (kabīr):", "older, elder; oldest, eldest"]
"senior (age, rank, etc.)"

Is it possible to convert these to concatenated string? e.g. for the first row:

"elative degree of كَبِير‎ (kabīr): greater; greatest"

The JSON saved in the database column looks like:

[
    {
        "glosses": [
            "elative degree of كَبِير‎ (kabīr):",
            "greater; greatest"
        ],
        "examples": [
            {
                "text": "‏اللّٰهُ أَكْبَر‎‎",
                "type": "example",
                "roman": "allāhu ʾakbar",
                "english": "God (Allah) is greater / the greatest"
            }
        ],
        "raw_glosses": [
            "greater; greatest"
        ]
    },
    {
        "glosses": [
            "elative degree of كَبِير‎ (kabīr):",
            "bigger, larger; biggest, largest"
        ],
        "raw_glosses": [
            "bigger, larger; biggest, largest"
        ]
    },
    {
        "glosses": [
            "elative degree of كَبِير‎ (kabīr):",
            "older, elder; oldest, eldest"
        ],
        "raw_glosses": [
            "older, elder; oldest, eldest"
        ]
    },
    {
        "glosses": [
            "senior (age, rank, etc.)"
        ],
        "raw_glosses": [
            "senior (age, rank, etc.)"
        ]
    }
]

Solution

  • This can be achieved with the following query:

    SELECT id, GROUP_CONCAT( parts SEPARATOR ' ' )
    FROM
    (
        SELECT id, parts
        FROM dictionary
        JOIN JSON_TABLE( senses, "$[*].glosses"
        COLUMNS(
            id FOR ORDINALITY,
            NESTED PATH '$[*]' COLUMNS ( parts VARCHAR( 255 ) PATH '$' )
        ) ) AS glosses
        WHERE dictionaryId = 713481
    ) AS sub
    GROUP BY id
    

    Which returns a result like:

    1   elative degree of كَبِير‎ (kabīr): greater; greatest
    2   elative degree of كَبِير‎ (kabīr): bigger, larger; biggest, largest
    3   elative degree of كَبِير‎ (kabīr): older, elder; oldest, eldest
    4   senior (age, rank, etc.)