… is json [array|object|scalar]
{a: 1}
Is json
ist ein Prädikat, ähnlich wie is null
, um etwas auf gültigen JSON-Inhalt zu testen. Der Test kann auf zwischen Arrays ([1,42]
), Objekten ({"a":42}
) und Skalaren (strings, numbers, true
, false
, null
) unterscheiden.
WHERE s IS JSON OBJECT
Das Beispiel liefert Zeilen, bei denen die Spalte s
gültiges JSON enthält, das auf der obersten Ebene ein JSON-Objekt ist.
Da is json
niemals fehlschlägt, kann man damit prüfen ob ein String gültiges JSON enthält. Wenn der zu prüfende Wert jedoch der SQL-Wert null
ist, liefert is json
null
(unknown) als Ergebnis. Das ist nicht zu verwechseln mit dem String 'null'
, welcher das JSON-Skalar null
darstellt.
Durch die Typeneinschränkungen Array
, Object
und Scalar
ist is json
auch für Daten vom Typ JSON nützlich. Die Typenbeschränkung Value
ist gleichbedeutend dem Weglassen der Typeneinschränkung – sie liefert für alle gültigen JSON Daten den Wert wahr.
{a: 1}
Mit is json
kann man nicht zwischen den konkreten skalaren Typen String, Zahl, Boolean und dem JSON-Wert Null unterscheiden (die SQL/JSON Path Item-Methode .type()
kann das jedoch).
Die Negation kann mit is not json
erfolgen. Dabei ist zu beachten, dass is not json object
sowohl für ungültiges JSON wahr liefert als auch für gültiges JSON das auf oberster Ebene kein Objekt ist.
SQL verwendet das in IETF RFC 8259 definierte JSON-Format. Dieses Format erlaubt das mehrfache Vorkommen eines Schlüssels in JSON-Objekten:0
{"a": 42,
"a": 1}
Daher akzeptiert auch is json solche Objekte als gültig. Für Fälle, in denen man eine strengere Validierung benötigt, sieht der SQL-Standard den Zusatz with unique [key]
vor. Objekte wie im Beispiel sind damit kein gültiges JSON mehr.
Weiters unterstützt SQL den Umgang mit anderen Formaten wie BSON oder AVRO, indem man den zu testenden Ausdruck eine Format
-Klausel hinten anstellt. Ohne Format
-Klausel gilt Format Json
und damit das im RFC 8259 beschriebene Format.
{a: 1}
Nur das Format Json
ist im SQL-Standard definiert. Weiter Namen und deren Bedeutung sind von der Implementierung definiert (IV180).
T832, „SQL/JSON path language: item method“
.type()
Item-Methode
IV180,„The data format specified by <implementation-defined JSON representation option>“
Das <JSON predicate>
is [not] json [value|array|object|scalar]
ist in ISO/IEC 9075-2:2023 als Teil des optionalen Features „T821, „Basic SQL/JSON query operators““ definiert.
20 Jahre SQL-Evolution kann man nicht an einem Tag nachholen. Abonniere den Newsletter via E-Mail, Bluesky oder RSS, um sukzessive aufzuholen und modern-sql.com am Radar zu behalten.
Markus verwandelt veraltetes SQL-92-Wissen in solides und zeitgemäßes SQL-Know-how
ISO/IEC 9075-2:2023 §4.48 (NOTE 111)