SQLite
 sql >> Datenbank >  >> RDS >> SQLite

in SQLite

Der -> und ->> -Operatoren wurden in SQLite-Version 3.38.0 eingeführt, die am 22. Februar 2022 veröffentlicht wurde. Beide Operatoren werden zum Extrahieren von Unterkomponenten von JSON verwendet. Aber es gibt einen feinen Unterschied zwischen ihnen.

Der Unterschied

Der Unterschied zwischen diesen Operatoren sieht folgendermaßen aus:

  • Der -> Operator gibt immer ein JSON zurück Darstellung der angegebenen Unterkomponente
  • Der ->> Operator gibt immer ein SQL zurück Darstellung der angegebenen Unterkomponente

Beispiel

Hier ist ein Beispiel, das den Unterschied zwischen diesen beiden Operatoren veranschaulicht:

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

Ergebnis:

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

Wir können diesen -> sehen gab den in doppelte Anführungszeichen eingeschlossenen Wert zurück, während ->> nicht.

Das liegt daran, dass -> hat eine JSON-Darstellung des Werts und ->> zurückgegeben gab eine SQL-Darstellung zurück.

Zahlen

Hier ist ein Beispiel, das Zahlen verwendet:

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

Ergebnis:

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

Folgendes passiert, wenn wir typeof() verwenden Funktion, um den SQL-Typ zu erhalten:

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

Ergebnis:

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

Wenn wir jedoch json_type() verwenden , erhalten wir den JSON-Typ:

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

Ergebnis:

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

Hier ist ein Beispiel, das eine reelle Zahl verwendet:

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

Ergebnis:

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

Und mit json_type() :

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

Ergebnis:

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

Nullwerte

Wenn das JSON-Dokument null enthält , dann -> gibt die JSON-Darstellung von null und ->> zurück gibt einfach einen Nullwert zurück.

Hier ist ein Beispiel, um zu demonstrieren, was ich meine:

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

Ergebnis:

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

Standardmäßig gibt die SQLite-Befehlszeilenschnittstelle (CLI) die leere Zeichenfolge zurück, wenn ein Nullwert zurückgegeben wird. Wir können also in unserem Beispiel sehen, dass -> hat den tatsächlichen JSON-Wert null zurückgegeben, während ->> hat einen tatsächlichen Nullwert zurückgegeben.

Um dies weiter zu demonstrieren, können wir unseren .nullvalue setzen zu etwas anderem als dem leeren String:

.nullvalue n/a

Lassen Sie uns nun die vorherige Abfrage erneut ausführen:

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

Ergebnis:

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

Dieses Mal n/a wurde für ->> ausgegeben Operator anstelle des leeren Strings.

Und das passiert, wenn wir die Ausgabe an typeof() übergeben und json_type() Funktionen:

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 "->>";

Ergebnis:

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

Eine Alternative:json_extract()

Eine andere Möglichkeit, Werte aus einem JSON-Dokument in SQLite zu extrahieren, ist die Verwendung von json_extract() Funktion. Diese Funktion funktioniert etwas anders als -> und ->> , dass der Rückgabetyp kontextabhängig ist.

Der json_extract() Die Funktion gibt nur JSON zurück, wenn zwei oder mehr Pfadargumente vorhanden sind (da das Ergebnis dann ein JSON-Array ist) oder wenn das einzelne Pfadargument auf ein Array oder Objekt verweist.

Wenn es nur ein Pfadargument gibt und dieser Pfad auf eine JSON-Null oder eine Zeichenfolge oder einen numerischen Wert verweist, dann json_extract() gibt den entsprechenden SQL-Wert NULL, TEXT, INTEGER oder REAL zurück.