Closed5

MySQL JSONカラム

miyapeimiyapei

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

miyapeimiyapei

JSON_UNQUOTE(JSON_EXTRACT(column, '$.field'))
JSON_UNQUOTE(column->'$.field')
などでも取れるが (後者は省略表記でいずれも同じ)、

この方法では "field": null で値が null の場合にも文字列になる
(JSON_VALUEでは NULL値 になる)

なお true などの bool はいずれの場合でも文字列

miyapeimiyapei

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" のいずれにも該当しない)

miyapeimiyapei

JSON_EXTRACTの結果をJSON_UNQUOTEした後は全てクォート無しの文字列となるため
比較値もそのまま文字列のnulltrueとして判定できる

JSON_VALUEの場合はシンプルに(?)
null の場合のみ NULL値、それ以外は文字列になる

なので特にキャストしない場合は比較値も
null の場合は文字列ではなく NULL値 で判定し、
true や false の場合は trueの「文字列」で判定する
JSON_VALUE(column, '$.field') = 'true'

miyapeimiyapei

まとめると
null を NULL値として得たい場合は JSON_VALUE(column, '$.field')

null を 文字列として得たい場合は JSON_UNQUOTE(JSON_EXTRACT(column, '$.field'))
(敢えて文字列として得たい場合はそんなにない気がするけど)

null以外 はキャストしない限りいずれの方法も全部文字列

このスクラップは2024/06/21にクローズされました