sql >> Databasteknik >  >> RDS >> SQLite

SQLite JSON_ARRAY_LENGTH()

I SQLite, json_array_length() funktion returnerar antalet element i en given JSON-array.

Arrayen tillhandahålls som ett argument. Om arrayen är inbäddad i ett större JSON-dokument kan vi använda ett valfritt andra argument för att ange sökvägen till arrayen.

Om värdet inte är en matris returnerar funktionen 0 .

Syntax

Funktionen kan användas på följande två sätt:

json_array_length(X)
json_array_length(X,P)

Där X representerar arrayen och P är en valfri sökväg som kan användas för att ange sökvägen till arrayen i ett större dokument.

Exempel

Här är ett grundläggande exempel att visa:

SELECT json_array_length('[ 7, 12, 10 ]');

Resultat:

3

Arrayen innehåller tre element och så 3 returneras.

Ange en sökväg

Vi kan också använda ett andra argument för att specificera sökvägen till arrayen:

SELECT json_array_length('[ 7, 12, 10 ]', '$');

Resultat:

3

I det här fallet är arrayen på toppnivån, så vi skickar $ som vägen.

Följande exempel använder en array som är inbäddad i ett större dokument:

SELECT json_array_length('{
    "dogs" : [
            { "name" : "Wag", "scores" : [ 7, 9 ] },
            { "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
            { "name" : "Woof", "scores" : [ 3, 2, 1 ] }
    ]
}', 
'$.dogs'
);

Resultat:

3

I det här fallet, arrayen vid dogs innehåller tre element.

Vi kan navigera ner till nästa nivå och hitta antalet element i en av de andra arrayerna:

SELECT json_array_length('{
    "dogs" : [
            { "name" : "Wag", "scores" : [ 7, 9 ] },
            { "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
            { "name" : "Woof", "scores" : [ 3, 2, 1 ] }
    ]
}', 
'$.dogs[1].scores'
);

Resultat:

4

Matriser är nollbaserade, så räkningen börjar vid 0 . Därför angav vi [1] för att få det andra elementet inom dogs array, som råkar vara ett JSON-objekt. Vi använder sedan .scores för att välja dess array.

Välja icke-matriser

Om sökvägen pekar på ett annat värde än en JSON-array, 0 returneras:

SELECT json_array_length('{
    "dogs" : [
            { "name" : "Wag", "scores" : [ 7, 9 ] },
            { "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
            { "name" : "Woof", "scores" : [ 3, 2, 1 ] }
    ]
}', 
'$.dogs[1].name'
);

Resultat:

0

Välja en icke-existerande sökväg

Om det andra argumentet pekar på en sökväg som inte finns, null returneras.

Låt oss först ställa in .nullvalue till NULL :

.nullvalue NULL

.nullvalue dot-kommandot låter oss tillhandahålla en sträng som kommer att användas för att ersätta null-värden. Det är ett av flera sätt du kan ersätta null-värden med en sträng i SQLite. I det här fallet ställer jag in den till NULL . Nu kommer alla nollvärden att returnera NULL istället för ett tomt resultat.

Låt oss nu anropa json_array_length() , men använd ett andra argument som pekar på en icke-existerande sökväg:

SELECT json_array_length('{
    "dogs" : [
            { "name" : "Wag", "scores" : [ 7, 9 ] },
            { "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
            { "name" : "Woof", "scores" : [ 3, 2, 1 ] }
    ]
}', 
'$.cats'
);

Resultat:

NULL

Ogiltiga sökvägar

Vi får ett felmeddelande om vår väg inte är väl utformad:

SELECT json_array_length('{
    "dogs" : [
            { "name" : "Wag", "scores" : [ 7, 9 ] },
            { "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
            { "name" : "Woof", "scores" : [ 3, 2, 1 ] }
    ]
}', 
'dogs'
);

Resultat:

Runtime error: JSON path error near 'dogs'

I det här fallet glömde jag att inkludera $. längst fram på stigen.

Ogiltiga JSON-dokument

Vi får också ett felmeddelande om att JSON inte är välformaterad:

SELECT json_array_length('{ "Dogs" : }', 
'$'
);

Resultat:

Runtime error: malformed JSON

Den här gången berättar felet att vår JSON är felaktig.


  1. En databasmodell för en onlineundersökning. Del 1

  2. ORA-00942:Kan man välja från schema.table men inte tabell?

  3. Oracle Pro*C/OCI installationshanterare för SIGSEGV/SIGABRT och vänner - varför och hur inaktiveras?

  4. Att ställa in schemat i PostgreSQL JDBC verkar inte fungera