2017-11-28 20 views
3

私はインデックスのないjsonレコードを含む列を持つアーカイブテーブルを持っています。サンプル:MySQL:JSONから結果セット

[{ 
    "attr1": "val1", 
    "attr2": "val2", 
    "attr3": "val3", 
    . 
    . 
    "attrN": "valN" 
}, { 
    "attr1": "val1.2", 
    "attr2": "val2.2", 
    "attr3": "val3.2", 
    . 
    . 
    "attrN": "valN.2" 
},...] 

私は結果セットとしてJSONを返すストアドプロシージャまたは関数を作成する必要があります。

attr1 | attr2 | attr3 | ... | attrN 
    _______________________________________________ 
    val1 | val2 | val3 | ... | valN 
    val1.2 | val2.2 | val2.2 | ... | valN.2 

私は他のクエリのためにそれを使用するように、それはレコードセットとして返す必要があります他のストアドプロシージャで使用できます。

私はこれとこれを達成することができました:一時テーブルを作成する以外に、別の方法がある場合は、私が思っていたRead JSON array in MYSQL

?私はパフォーマンスと効率性について考えていました。同様に、20人または50人のユーザーがこれをトリガーするとどうなりますか?これを行うより良い方法はありますか?

注:JSONのavarageサイズ〜1メガバイト

答えて

0

このストアドプロシージャは、出力あなたが必要とする結果は、パフォーマンスが十分であるかどうかを確認するために、実際のデータを使用してテストする必要があることを、動的クエリを作成します

CREATE PROCEDURE jsonToCols(IN json JSON, IN target VARCHAR(50)) 
BEGIN 
    SET @j = 0; 
    SET @fields = JSON_KEYS(json, "$[0]"); 
    SET @f_length = JSON_LENGTH(@fields); 
    SET @select = ""; 
    WHILE @j < JSON_LENGTH(json) DO 
     SET @i = 0; 
     SET @select = CONCAT(@select, "SELECT "); 
     WHILE @i < @f_length DO 
      SET @attr_name = REPLACE(JSON_EXTRACT(@fields, CONCAT("$[", @i, "]")), '\"', ''); 
      SET @key = CONCAT('$.', @attr_name); 
      SET @select = CONCAT(@select, "JSON_EXTRACT(json, '$[", @j , "].", @attr_name, "') as ", @attr_name, ", "); 
      SET @i = @i + 1; 
     END WHILE; 

     SET @select = CONCAT(LEFT(@select, length(@select)-2), " FROM ", target ," UNION ALL "); 
     SET @j = @j + 1; 
    END WHILE; 

    SET @select = LEFT(@select, length(@select)-11); 

    PREPARE stmt FROM @select; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt; 
END; 

動的に作成したクエリは次のようになります。

SELECT JSON_EXTRACT(json, '$[0].attr1') as attr1, JSON_EXTRACT(json, '$[0].attr2') as attr2, JSON_EXTRACT(json, '$[0].attr3') as attr3, JSON_EXTRACT(json, '$[0].attrN') as attrN 
FROM test 
UNION ALL 
SELECT JSON_EXTRACT(json, '$[1].attr1') as attr1, JSON_EXTRACT(json, '$[1].attr2') as attr2, JSON_EXTRACT(json, '$[1].attr3') as attr3, JSON_EXTRACT(json, '$[1].attrN') as attrN 
FROM test 

FIDDLE

関連する問題