2017-06-21 2 views
4

La question est au sujet de MySQL/MariaDB JSON Functions.
Comment trouvez-vous l'intersection de plusieurs structures JSON?
En PHP, il est fait en utilisant ce code:Trouver l'intersection des objets ou des tableaux MySQL JSON

array_intersect(
    ['a', 'b'], 
    ['b', 'c'] 
); 

Si l'on imagine une fonction nommée JSON_INTERSECT, le code ressemblerait à ceci:

SET @json1 = '{"key1": "a", "key2": "b"}'; 
SET @json2 = '["b", "c"]'; 
SET @json3 = '["c", "d"]'; 

SELECT JSON_INTERSECT(@json1, @json2); // returns '["b"]'; 
SELECT JSON_INTERSECT(@json1, @json3); // returns NULL; 
+0

Veuillez expliquer la structure de vos tables SQL – Dimgold

+0

@Dimgold Pas de tables. La question a été mise à jour avec plus de détails. – Yochanan

+0

Je crois que sql n'analyse pas les tableaux dont vous avez besoin pour définir une fonction qui compare les array array en utilisant [regex] (https://stackoverflow.com/questions/9099469/mysql-select-like-or-regexp-to-match-multiple- mots-en-un-enregistrement) ou [délimiteurs] (https://stackoverflow.com/questions/3914199/split-strings-using-mysql) – Abra001

Répondre

0

Il semble qu'il n'y a pas de bonne intégré façons de faire cela et il n'y a toujours pas de bonnes réponses sur ce sujet, donc je pensais que j'ajouterais ma solution & sale. Si vous exécutez le code ci-dessous, il créera une fonction appelée MY_JSON_INTERSECT qui produira des résultats exactement comme l'affiche originale spécifiée. Assurez-vous que vous avez regardé encore et êtes ok avec la création d'une nouvelle fonction avant de faire confiance mon code:

delimiter $$ 
CREATE FUNCTION `MY_JSON_INTERSECT`(Array1 VARCHAR(1024), Array2 VARCHAR(1024)) RETURNS varchar(1024) 
BEGIN 
    DECLARE x int; 
    DECLARE val, output varchar(1024); 
    SET output = '[]'; 
    SET x = 0; 
    IF JSON_LENGTH(Array2) < JSON_LENGTH(Array1) THEN 
     SET val = Array2; 
     SET Array2 = Array1; 
     SET Array1 = val; 
    END IF; 
    WHILE x < JSON_LENGTH(Array1) DO 
     SET val = JSON_EXTRACT(Array1, CONCAT('$[',x,']')); 
     IF JSON_CONTAINS(Array2,val) THEN 
      SET output = JSON_MERGE(output,val); 
     END IF; 
     SET x = x + 1; 
    END WHILE; 
    IF JSON_LENGTH(output) = 0 THEN 
     RETURN NULL; 
    ELSE 
     RETURN output; 
    END IF; 
END$$ 

Vous pouvez alors appeler la fonction comme ceci:

SELECT MY_JSON_INTERSECT('[1,2,3,4,5,6,7,8]','[0,3,5,7,9]'); 

Sorties:

[3,5,7] 

Ce n'est pas beau ou efficace, mais c'est quelque chose qui fonctionne ... Espérons que de meilleures réponses viendront bientôt.