SELECT * FROM mytable WHERE LOWER(JSON_EXTRACT(metadata, "$.title")) = JSON_QUOTE("hello world") e SELECT * FROM mytable WHERE LOWER(metadata->"$.title") = JSON_QUOTE("hello world") funziona, ma non sono sicuro del motivo per cui devo usare JSON_QUOTE quando si utilizza LOWER vs non averne bisogno per una ricerca esatta.
Se qualcuno può spiegare perché, lo contrassegnerò volentieri come risposta.