MySQL JSONカラム

フィールドの取得
JSON_VALUE(column, '$.field')

JSON_UNQUOTE(JSON_EXTRACT(column, '$.field'))
JSON_UNQUOTE(column->'$.field')
などでも取れるが (後者は省略表記でいずれも同じ)、
この方法では "field": null
で値が null
の場合にも文字列になる
(JSON_VALUEでは NULL値
になる)
なお true
などの bool はいずれの場合でも文字列

JSON_EXTRACTはSQL中の判定などでも使用しづらい
(というよりJSON_EXTRACT単体の結果に対しては比較しないほうが良い)
JSON_EXTRACT単体では対象の値のクォート有無がそのまま返る
クォート付き "field": "value"
→ "value"
(JSON_UNQUOTEで value
にする)
クォート無し "field": null
や true などは「結果セットでは」クォート無しの文字列で返る
ただし、SQL中の比較などで単体利用すると
・対象がクォート付きの場合はクォート無しの比較値でのみ該当し(たぶん)
(JSON_EXTRACT(column, '$.field') = 'value'
JSON_UNQUOTE(JSON_EXTRACT(column, '$.field')) = 'value'
といずれもクォート無しの value
でのみ該当し、
前者の比較値を "value"
などとしても該当しない)
・対象がクォート無しの場合は、比較自体ができない(たぶん)
(null の場合は 文字列の null
、"null"
、NULL値
のいずれにも該当せず
true や false の場合は true
、"true"
のいずれにも該当しない)

JSON_EXTRACTの結果をJSON_UNQUOTEした後は全てクォート無しの文字列となるため
比較値もそのまま文字列のnull
や true
として判定できる
JSON_VALUEの場合はシンプルに(?)
null の場合のみ NULL値、それ以外は文字列になる
なので特にキャストしない場合は比較値も
null の場合は文字列ではなく NULL値
で判定し、
true や false の場合は true
の「文字列」で判定する
JSON_VALUE(column, '$.field') = 'true'

まとめると
null を NULL値として得たい場合は JSON_VALUE(column, '$.field')
null を 文字列として得たい場合は JSON_UNQUOTE(JSON_EXTRACT(column, '$.field'))
(敢えて文字列として得たい場合はそんなにない気がするけど)
null以外 はキャストしない限りいずれの方法も全部文字列