SQLite
 sql >> база данни >  >> RDS >> SQLite

Оператор

В SQLite, ->> оператор извлича подкомпонент от JSON документ и връща SQL представяне на този подкомпонент.

->> Операторът беше въведен за първи път в SQLite версия 3.38.0 (издадена на 22 февруари 2022 г.).

Синтаксис

Синтаксисът е така:

json ->> path

Където json е JSON документът и path е пътят към подкомпонента, който искаме да извлечем от него.

Така че предоставяме JSON документ отляво на оператора и указваме пътя, който искаме да извлечем, отдясно.

->> операторът винаги връща SQL представяне на посочения подкомпонент. За да върнете JSON представяне, използвайте -> вместо оператор.

Примери

Ето един прост пример, за да демонстрирате как ->> оператор работи:

SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> '$';

Резултат:

{"name":"Wag","type":"Dog"}

В този случай посочих път на '$' който връща целия документ.

Нека посочим друг път:

SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> '$.type';

Резултат:

Dog

Можем също да пропуснем знака за долар и точката като цяло, както следва:

SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> 'type';

Резултат:

Dog

Ето го с по-голям JSON документ:

SELECT '[
        { 
        "user" : "Spike",
        "age" : 30,
        "scores" : [ 9, 7, 3 ]
        },
        { 
        "user" : "Faye",
        "age" : 25,
        "scores" : [ 90, 87, 93 ]
        },
        { 
        "user" : "Jet",
        "age" : 40,
        "scores" : [ 50, 38, 67 ]
        }
        ]' ->> '$[0]';

Резултат:

{"user":"Spike","age":30,"scores":[9,7,3]}

В SQLite масивите са базирани на нула и така указват [0] връща първия елемент на масива.

Ако искахме само да получим резултатите на този потребител, бихме могли да направим това:

SELECT '[
        { 
        "user" : "Spike",
        "age" : 30,
        "scores" : [ 9, 7, 3 ]
        },
        { 
        "user" : "Faye",
        "age" : 25,
        "scores" : [ 90, 87, 93 ]
        },
        { 
        "user" : "Jet",
        "age" : 40,
        "scores" : [ 50, 38, 67 ]
        }
        ]' ->> '$[0].scores';

Резултат:

[9,7,3]

Можем да отидем още по-дълбоко и да извлечем конкретен резултат:

SELECT '[
        { 
        "user" : "Spike",
        "age" : 30,
        "scores" : [ 9, 7, 3 ]
        },
        { 
        "user" : "Faye",
        "age" : 25,
        "scores" : [ 90, 87, 93 ]
        },
        { 
        "user" : "Jet",
        "age" : 40,
        "scores" : [ 50, 38, 67 ]
        }
        ]' ->> '$[0].scores[1]';

Резултат:

7

Несъществуващ път

Ако пътят не съществува в JSON, се връща нулева стойност:

SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> '$.age';

Резултат:

null

Имайте предвид, че в SQLite можете да използвате .nullvalue за да посочите низ за извеждане всеки път, когато се върне нулева стойност. В моя случай преди това изпълних следната команда:

.nullvalue null

Това указва, че текстът null трябва да се извежда всеки път, когато се върне нулева стойност. Ето защо горният пример извежда текста null . Ако не бях направил това, резултатът можеше да е празен.

Невалиден JSON

Ако първият аргумент не е валиден JSON, се извежда грешка:

SELECT '{ "name" }' ->> '$';

Резултат:

Runtime error: malformed JSON

Невалиден път

И ако вторият аргумент не е валиден път, се извежда грешка:

SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> '$name';

Резултат:

Runtime error: JSON path error near 'name'

В този случай забравих да включа точката (. ) между знака за долар ($ ) и name .

Въпреки това, както споменахме, възможно е да пропуснете знака за долар и точката напълно:

SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> 'name';

Резултат:

Wag

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQLite Sum() срещу Total():Каква е разликата?

  2. java.lang.IllegalArgumentException:колоната '_id' не съществува

  3. Запазване на данни в метода onDestroy на дейността

  4. SQLiteException:таблицата вече съществува

  5. как да стартирам приложение с SQLite darabase на емулатор на Android Studio?