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

в SQLite

-> и ->> Операторите бяха въведени в SQLite версия 3.38.0, която беше пусната на 22 февруари 2022 г. И двата оператора се използват за извличане на подкомпоненти на JSON. Но има фина разлика между тях.

Разликата

Разликата между тези оператори е следната:

  • -> операторът винаги връща JSON представяне на посочения подкомпонент
  • ->> операторът винаги връща SQL представяне на посочения подкомпонент

Пример

Ето пример, който илюстрира разликата между тези два оператора:

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

Резултат:

+-------+-----+
|  ->   | ->> |
+-------+-----+
| "Dog" | Dog |
+-------+-----+

Можем да видим, че -> върна стойността, затворена в двойни кавички, докато ->> не.

Това е така, защото -> върна JSON представяне на стойността и ->> върна SQL представяне.

Числа

Ето пример, който използва числа:

SELECT 
    '{ "age" : 10 }' -> '$.age' AS "->",
    '{ "age" : 10 }' ->> '$.age' AS "->>";

Резултат:

+----+-----+
| -> | ->> |
+----+-----+
| 10 | 10  |
+----+-----+

Ето какво се случва, когато използваме typeof() функция за получаване на типа SQL:

SELECT 
    typeof('{ "age" : 10 }' -> '$.age') AS "->",
    typeof('{ "age" : 10 }' ->> '$.age') AS "->>";

Резултат:

+------+---------+
|  ->  |   ->>   |
+------+---------+
| text | integer |
+------+---------+

Ако обаче използваме json_type() , ще получим типа JSON:

SELECT 
    json_type('{ "age" : 10 }' -> '$.age') AS "->",
    json_type('{ "age" : 10 }' ->> '$.age') AS "->>";

Резултат:

+---------+---------+
|   ->    |   ->>   |
+---------+---------+
| integer | integer |
+---------+---------+

Ето пример, който използва реално число:

SELECT 
    typeof('{ "age" : 1.2 }' -> '$.age') AS "->",
    typeof('{ "age" : 1.2 }' ->> '$.age') AS "->>";

Резултат:

+------+------+
|  ->  | ->>  |
+------+------+
| text | real |
+------+------+

И с json_type() :

SELECT 
    json_type('{ "age" : 1.2 }' -> '$.age') AS "->",
    json_type('{ "age" : 1.2 }' ->> '$.age') AS "->>";

Резултат:

+------+------+
|  ->  | ->>  |
+------+------+
| real | real |
+------+------+

Нулеви стойности

Ако JSON документът съдържа null , след това -> ще върне JSON представянето на null и ->> просто ще върне нулева стойност.

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

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

Резултат:

+------+-----+
|  ->  | ->> |
+------+-----+
| null |     |
+------+-----+

По подразбиране интерфейсът на командния ред на SQLite (CLI) връща празния низ всеки път, когато се върне нулева стойност. Така че можем да видим от нашия пример, че -> върна действителната стойност на JSON null, докато ->> върна действителна нулева стойност.

За да демонстрираме допълнително това, можем да зададем нашия .nullvalue към нещо различно от празния низ:

.nullvalue n/a

Сега нека изпълним предишната заявка отново:

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

Резултат:

+------+-----+
|  ->  | ->> |
+------+-----+
| null | n/a |
+------+-----+

Този път n/a беше изведен за ->> оператор вместо празния низ.

И ето какво се случва, когато предадем изхода на typeof() и json_type() функции:

SELECT 
    typeof('{ "name" : "Wag", "type" : null }' -> '$.type') AS "->",
    typeof('{ "name" : "Wag", "type" : null }' ->> '$.type') AS "->>";

SELECT 
    json_type('{ "name" : "Wag", "type" : null }' -> '$.type') AS "->",
    json_type('{ "name" : "Wag", "type" : null }' ->> '$.type') AS "->>";

Резултат:

+------+------+
|  ->  | ->>  |
+------+------+
| text | null |
+------+------+
+------+-----+
|  ->  | ->> |
+------+-----+
| null | n/a |
+------+-----+

Алтернатива:json_extract()

Друг начин за извличане на стойности от JSON документ в SQLite е да използвате json_extract() функция. Тази функция работи малко по-различно от -> и ->> в това, че типът на връщане зависи от контекста.

json_extract() функцията връща JSON само ако има два или повече аргумента на пътя (тъй като резултатът е JSON масив) или ако единичният аргумент за път препраща към масив или обект.

Ако има само един аргумент за път и този път препраща към JSON нула, низ или числова стойност, тогава json_extract() връща съответната SQL стойност NULL, TEXT, INTEGER или REAL.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Предварително попълнената база данни не работи при API 28 не хвърля такова изключение на таблицата

  2. Вземете първия понеделник от годината в SQLite

  3. Как работи Typeof() в SQLite

  4. listview показва данните от базата данни в android

  5. Лека инсталация на WordPress:Как да инсталирате WordPress с SQLite