2017-06-21 12 views
4

質問は約MySQL/MariaDB JSON Functionsです。
複数のJSON構造の交差をどのように見つけることができますか? PHPで
このコードを使用して行われます:MySQL JSONオブジェクトまたは配列の共通部分を見つける

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

我々はJSON_INTERSECTという名前の関数を想像した場合、コードは次のようになります。

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

あなたの構造を説明してください。 – Dimgold

+0

@Dimgoldテーブルがありません。質問はより詳細に更新されました。 – Yochanan

+0

私は、sql doesntは、[regex]を使ってarraystringsを比較する関数を設定する必要があると確信しています(https://stackoverflow.com/questions/9099469/mysql-select-like-or-regexp-to-match-multiple-単語の1つのレコード)または[デリミタ](https://stackoverflow.com/questions/3914199/split-strings-using-mysql) – Abra001

答えて

0

それは、組み込みの方法は良いが存在しないに見えますこれを行うと、このトピックについてはまだ良い答えがないので、私は速い&汚い解決策を追加すると思った。以下のコードを実行すると、MY_JSON_INTERSECTという関数が作成され、指定された元のポスターと同じ結果が出力されます。

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

出力::

[3,5,7] 

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$$ 

あなたは、このような関数を呼び出すことができます:あなたがこれを超える見てきたことを確認して、自分のコードを信頼する前に、新しい関数を作成してOKです

これは美しくないか効率的ではありませんが、うまく機能しています。

関連する問題