【MySQL】JSON系メモ

JSON_EXTRACT(指定したパスを取得する)

SELECT
    JSON_EXTRACT('[1, 2]', '$[0]'), -- 1
    JSON_EXTRACT('{"sub1":"英語", "sub2":"数学"}', '$.sub1'), -- "英語"
    JSON_EXTRACT('[{"sub":"英語", "score":90}, {"sub":"数学", "score":80}]', '$[0].score'), -- 90
    JSON_EXTRACT('{"sub":"英語", "scores":[90, 80]}', '$.scores[1]') -- 80

JSON_CONTAINS(指定した値を含んでいるか)

SELECT
    JSON_CONTAINS('[1, 2, 3]', '1', '$'),              -- 配列に1があるか:1
    JSON_CONTAINS('[1, 2, 3]', '9', '$'),              -- 配列に9があるか:0
    JSON_CONTAINS('{"sub":"英語"}', '"英語"', '$.sub'), -- subが英語か:1
    JSON_CONTAINS('{"sub":"英語"}', '"数学"', '$.sub')  -- subが数学か:0

JSON_CONTAINS_PATH(指定したパスを含んでいるか)

SELECT
	  JSON_CONTAINS_PATH('[1, 2]', 'one', '$[0]'), -- 0番目の配列があるか:1
	  JSON_CONTAINS_PATH('[1, 2]', 'one', '$[2]'), -- 2番目の配列があるか:0
	  JSON_CONTAINS_PATH('[1, 2]', 'one', '$[0]', '$[2]'), -- 0番目 or 2番目の配列があるか:1
	  JSON_CONTAINS_PATH('[1, 2]', 'all', '$[0]', '$[1]'), -- 0番目 and 1番目の配列があるか:1
	  JSON_CONTAINS_PATH('[1, 2]', 'all', '$[0]', '$[2]'), -- 0番目 and 2番目の配列があるか:0
    JSON_CONTAINS_PATH('{"sub1":"英語", "sub2":"数学"}', 'one', '$.sub1'), -- keyがsub1の要素があるか:1
    JSON_CONTAINS_PATH('{"sub1":"英語", "sub2":"数学"}', 'one', '$.sub1', '$.sub3'), -- keyがsub1 or keyがsub3の要素があるか:1
    JSON_CONTAINS_PATH('{"sub1":"英語", "sub2":"数学"}', 'all', '$.sub1', '$.sub3')  -- keyがsub1 and keyがsub3の要素があるか:0

JSON_SEARCH(指定した値のパスを取得)

SELECT
	  JSON_SEARCH('["a", "b"]', 'one', 'a'), -- "$[0]"
	  JSON_SEARCH('["a", "b"]', 'one', 'c'), -- null
	  JSON_SEARCH('["a", "b", "b"]', 'one', 'b'), -- "$[1]"
	  JSON_SEARCH('["a", "b", "b"]', 'all', 'b'), -- ["$[1]", "$[2]"]
	  JSON_SEARCH('{"sub1":"英語", "sub2":"数学", "sub3":"数学"}', 'one', '英語'), -- "$.sub1"
	  JSON_SEARCH('{"sub1":"英語", "sub2":"数学", "sub3":"数学"}', 'one', '国語'), -- null
	  JSON_SEARCH('{"sub1":"英語", "sub2":"数学", "sub3":"数学"}', 'one', '数学'), -- "$.sub2"
	  JSON_SEARCH('{"sub1":"英語", "sub2":"数学", "sub3":"数学"}', 'all', '数学')  -- ["$.sub2", "$.sub3"]

JSON_KEYS(パスを取得)

SELECT
	  JSON_KEYS('{"sub1":"英語", "sub2":"数学"}'), -- ["sub1", "sub2"]
	  JSON_KEYS('{"key":"value", "sub":{"name":"英語", "point":90}}'), -- ["key", "sub"]
	  JSON_KEYS('{"key":"value", "sub":{"name":"英語", "point":90}}', '$.sub') -- ["name", "point"]

JSON_TABLE(JSONをテーブルに変換)

SELECT
	*
FROM
	JSON_TABLE(
		'[{"name":"東京駅", "x":35.6812405, "y":139.7645499}, {"name":"渋谷駅", "x":35.6580382, "y":139.6990609}]',
        "$[*]" COLUMNS(
            name VARCHAR(255) PATH '$.name',
            x DOUBLE PATH '$.x',
            y DOUBLE PATH '$.y'
		    )
    ) AS json_split

namexy
東京駅35.6812405139.7645499
渋谷駅35.6580382139.6990609

以上になります。
お読み頂き、ありがとうございました。

Rails

前の記事

【Rails】コマンド集