I think it is safer to mention that the -> operator is *incompatible* with MySQL and Postgres' version of ->. In MySQL and Postgres, the only reason why you would use -> is to get a JSON quoted string, which no SQLite json function supports. Instead, it is only when using the ->> operator that behaviour between SQLite and MySQL or SQLite and Postgres are semantically identical. ``` # Postgres and SQLite -- for valid inputs, '->' is not compatible postgres> SELECT '{"a":{"b":{"c":"value"}}}'::JSON->'a'->'b'->'c'; "value" sqlite> SELECT '{"a":{"b":{"c":"value"}}}'->'a'->'b'->'c'; value -- for valid inputs, '->>' is compatible postgres> SELECT '{"a":{"b":{"c":"value"}}}'::JSON->'a'->'b'->>'c'; value sqlite> SELECT '{"a":{"b":{"c":"value"}}}'->'a'->'b'->>'c'; value -- for invalid inputs, '->' is not compatible postgres> SELECT '{"a":{"b":{"c":"value'::JSON->'a'->'b'->'c'; ERROR: invalid input syntax for type json sqlite> SELECT '{"a":{"b":{"c":"value'->'a'->'b'->'c'; -- json_nextract cascades NULL all the way down the chain NULL -- for invalid inputs, '->>' is compatible postgres> SELECT '{"a":{"b":{"c":"value'::JSON->'a'->'b'->>'c'; ERROR: invalid input syntax for type json sqlite> SELECT '{"a":{"b":{"c":"value'->'a'->'b'->>'c'; -- json_nextract cascades NULL, but gets caught by the json_extract at the end of the chain malformed JSON ``` ``` # MySQL and SQLite # I'm using json_extract() and json_unquote(json_extract()) as aliases for -> and ->> because no db fiddle website I found seems to support that syntax for MySQL -- for valid inputs, '->' is not compatible mysql> SELECT json_extract('{"a":{"b":{"c":"value"}}}', '$.a.b.c'); "value" sqlite> SELECT '{"a":{"b":{"c":"value"}}}'->'$.a.b.c'; value -- for valid inputs, '->>' is compatible mysql> SELECT json_unquote(json_extract('{"a":{"b":{"c":"value"}}}', '$.a.b.c')); value sqlite> SELECT '{"a":{"b":{"c":"value"}}}'->>'$.a.b.c'; value -- for invalid inputs, '->' is not compatible mysql> SELECT json_extract('{"a":{"b":{"c":"value', '$.a.b.c'); Error: ER_INVALID_JSON_TEXT_IN_PARAM sqlite> SELECT '{"a":{"b":{"c":"value'->'$.a.b.c'; -- json_nextract cascades NULL all the way down the chain NULL -- for invalid inputs, '->>' is compatible mysql> SELECT json_unquote(json_extract('{"a":{"b":{"c":"value', '$.a.b.c')); Error: ER_INVALID_JSON_TEXT_IN_PARAM sqlite> SELECT '{"a":{"b":{"c":"value'->>'$.a.b.c'; -- json_extract catches the error malformed JSON ```