2016-09-10 2 views
2

Kann ich ein JSON-Array als Parameter für eine IN-Klausel mit MySQL (Version 5.7 und höher, als JSON-Unterstützung) verwenden?MySQL JSON-Array zur Verwendung in "IN" -Klausel?

Unten finden Sie den Code ein, den ich nicht ganz kann bekommen arbeiten ...

DROP TABLE IF EXISTS json_table; 
    CREATE TEMPORARY TABLE json_table(  
     id INT, 
     data JSON 
    ); 

    INSERT INTO json_table (id, data) VALUES (1, "[1,2,3,4,19,20]"); 

    SELECT jt.id, jt.data, REPLACE(REPLACE(jt.data, '[', ''), ']', ''), jt.data->"$[4]" 
    FROM json_table jt; 

    SELECT stuff.name 
    FROM table_stuff stuff 
    #JOIN json_table jt ON stuff.id IN (1,2,3,4,19,20); 
    JOIN json_table jt ON stuff.id IN (REPLACE(REPLACE(jt.data, '[', ''), ']', ''));   

    DROP TABLE IF EXISTS json_table; 
+0

Sie können nicht. Dies würde dynamisch Build (String) und ausgeführte Abfrage erfordern. Wie Sie es geschrieben haben, ist es nur ein einzelner "TEXT" -Wert. Verwenden Sie stattdessen [diese Funktionen] (https://dev.mysql.com/doc/refman/5.7/en/json-search-functions.html). –

+0

@KamilG. Danke Kamil – aero

Antwort

2

ich eine JSON-Funktion eher erwarten würde zu arbeiten, als IN. Etwas wie:

SELECT stuff.name 
FROM table_stuff stuff JOIN 
    json_table jt 
    ON JSON_CONTAINS(jt.data, CONVERT(stuff.id, char)) = 1; 
+0

Gordon, wäre 'json_contains (...) = 1' nicht sauberer und folge der Logik für 0/1/null Rückgabewert, um Verwirrung zu vermeiden? –

+0

@KamilG. . . . Ja. Ich habe beim ersten Schreiben an 'find_in_set()' gedacht, aber 'json_contains()' gibt nur 0 und 1 (und möglicherweise 'NULL') zurück. –

+0

@GordonLinoff Danke Gordon, es funktioniert super! – aero