Dela via


Operatorer – Frågespråk i Cosmos DB (i Azure och Fabric)

Cosmos DB (i Azure och Fabric) stöder en omfattande uppsättning operatorer som gör att du kan utföra komplexa frågor och datamanipuleringar. Dessa operatorer omfattar bitvis, likhet och jämförelse, logiska operatorer och ternary-/sammanslagningsoperatorer, som var och en har specifika syften vid frågekonstruktion och databearbetning.

Bitvisa operatörer

Bitvis-operatorer är användbara för att utföra åtgärder på låg nivå på heltalsvärden när du skapar JSON-resultatuppsättningar. Dessa operatorer fungerar på samma sätt som liknande operatorer i programmeringsspråk på högre nivå som C# och JavaScript. Exempel på bitvis C#-operatorer finns i Bitwise- och skiftoperatorer.

I följande tabell beskrivs de bitvisa åtgärder som stöds i API:et för NoSQL:

Verksamhet Operator Description
Vänster skift << Flytta det vänstra värdet till vänster med det angivna antalet bitar.
Höger skift >> Flytta vänster värde åt höger med det angivna antalet bitar.
Högerskift med noll fyllning (osignerad) >>> Flytta vänster värde åt höger med det angivna antalet bitar utan att fylla i de flesta bitar till vänster.
och & Beräknar bitvis logisk AND.
OR | Beräknar bitvis logisk OR.
XOR ^ Beräknar bitvis logisk exklusiv OR.

Example

Följande fråga visar varje bitvis operator:

SELECT 
    (100 >> 2) AS rightShift,
    (100 << 2) AS leftShift,
    (100 >>> 0) AS zeroFillRightShift,
    (100 & 1000) AS logicalAnd,
    (100 | 1000) AS logicalOr,
    (100 ^ 1000) AS logicalExclusiveOr

Den här frågan returnerar följande resultat:

[
  {
    "rightShift": 25,
    "leftShift": 400,
    "zeroFillRightShift": 100,
    "logicalAnd": 96,
    "logicalOr": 1004,
    "logicalExclusiveOr": 908
  }
]

Viktigt!

Bitvisoperatorerna i Cosmos DB följer samma beteende som bitvis-operatorer i JavaScript. JavaScript lagrar tal som 64 bitars flyttalsnummer, men alla bitvis åtgärder utförs på 32-bitars binära tal. Innan en bitvis åtgärd utförs konverterar JavaScript tal till 32 bitars signerade heltal. När bitvis-åtgärden har utförts konverteras resultatet tillbaka till 64-bitars JavaScript-nummer. Mer information om bitvis-operatorerna i JavaScript finns i JavaScript-binära bitvisoperatorer på Mozilla Developer Network (MDN) Web Docs.

Likhets- och jämförelseoperatorer

Likhets- och jämförelseoperatorer kontrollerar två uttryck för likvärdighet eller jämför dem relationellt. I följande tabell visas resultatet av likhetsjämförelser mellan två JSON-typer i API:et för NoSQL:

Odefinierad Null Boolean Nummer String Object Array
Odefinierad Odefinierad Odefinierad Odefinierad Odefinierad Odefinierad Odefinierad Odefinierad
Noll Odefinierad Ok Odefinierad Odefinierad Odefinierad Odefinierad Odefinierad
Boolean Odefinierad Odefinierad Ok Odefinierad Odefinierad Odefinierad Odefinierad
Nummer Odefinierad Odefinierad Odefinierad Ok Odefinierad Odefinierad Odefinierad
Sträng Odefinierad Odefinierad Odefinierad Odefinierad Ok Odefinierad Odefinierad
Objekt Odefinierad Odefinierad Odefinierad Odefinierad Odefinierad Ok Odefinierad
Array Odefinierad Odefinierad Odefinierad Odefinierad Odefinierad Odefinierad Ok

För jämförelseoperatorer som >``, >=, `!=, <``, and <=, comparison across types or between two objects or arrays produces `undefined. Om resultatet av det skalära uttrycket är undefined``, the item isn't included in the result, because odefinieratdoesn't equate tosant''.

Example

I följande fråga jämförs ett tal- och strängvärde, vilket ger "odefinierat". Filtret innehåller därför inga resultat:

SELECT
    *
FROM
    products p
WHERE 
    0 = "true"

Logiska operatorer

Logiska operatorer jämför två uttryck med booleska (true/false) operander. I följande avsnitt beskrivs sanningstabellerna och prioriteten för varje logisk operator.

OR-operatorn

Operatorn OR returnerar true när något av villkoren är "true".

true false undefined
true true true true
false true false undefined
undefined true undefined undefined

OCH-operator

Operatorn AND returnerar true när båda uttrycken är "true".

true false undefined
true true false undefined
false false false false
undefined undefined false undefined

NOT-operatorn

Operatorn NOT ändrar värdet för ett booleskt uttryck.

NOT
true false
false true
undefined undefined

Operatorernas prioritet

De logiska operatorerna OR``, AND' och NOT har följande prioritetsnivåer:

Operator Priority
NOT 1
AND 2
OR 3

Projektionsoperator

Specialoperatorn * projicerar hela objektet som det är. När det används måste det vara det enda projekterade fältet. En fråga som SELECT * FROM products p är giltig, men SELECT VALUE * FROM products p eller SELECT *, p.id FROM products p är inte giltig.

Ternära- och sammanslagningsoperatörer

Operatorerna Ternary och coalesce utvärderar uttryck och returnerar resultat baserat på booleska operander eller fältexistens. Dessa operatorer fungerar på samma sätt som liknande operatorer i populära programmeringsspråk som C# och JavaScript. Använd operatorerna ternary (?) och coalesce (??) för att skapa villkorsuttryck som är motståndskraftiga mot halvstrukturerade eller blandade data.

Operatorn Ternary

Operatorn ? returnerar ett värde baserat på utvärderingen av ett booleskt uttryck.

Syntax

<bool_expr> ?  
    <expr_true> : 
    <expr_false>

Arguments

Description
bool_expr Ett booleskt uttryck.
expr_true Uttrycket som ska utvärderas om bool_expr utvärderas till true.
expr_false Uttrycket som ska utvärderas om bool_expr utvärderas till false.

Examples

I det här exemplet används objekt i en container som innehåller flera metadataegenskaper relaterade till priser. Egenskapen collapsible finns inte på alla objekt:

[
  {
    "name": "Stangincy trekking poles",
    "price": 24.50,
    "onCloseout": false,
    "onSale": true,
    "collapsible": true
  },
  {
    "name": "Vimero hiking poles",
    "price": 24.50,
    "onCloseout": false,
    "onSale": false
  },
  {
    "name": "Kramundsen trekking poles",
    "price": 24.50,
    "onCloseout": true,
    "onSale": true,
    "collapsible": false
  }
]

Den här frågan utvärderar onSale uttrycket, vilket motsvarar onSale = true``. The query returns the price multiplied by 0,85iftrue, or the price unchanged if `false:

SELECT
    p.name,
    p.price AS subtotal,
    p.onSale ? (p.price * 0.85) : p.price AS total
FROM
    products p

Den här frågan returnerar:

[
  {
    "name": "Stangincy trekking poles",
    "subtotal": 24.5,
    "total": 20.825
  },
  {
    "name": "Vimero hiking poles",
    "subtotal": 24.5,
    "total": 24.5
  },
  {
    "name": "Kramundsen trekking poles",
    "subtotal": 24.5,
    "total": 20.825
  }
]

Du kan också kapsla anrop till operatorn ? . Det här exemplet lägger till en extra beräkning baserat på en andra egenskap (onCloseout):

SELECT
    p.name,
    p.price AS subtotal,
    p.onCloseout ? (p.price * 0.55) : p.onSale ? (p.price * 0.85) : p.price AS total
FROM
    products p

Den här frågan returnerar:

[
  {
    "name": "Stangincy trekking poles",
    "subtotal": 24.5,
    "total": 20.825
  },
  {
    "name": "Vimero hiking poles",
    "subtotal": 24.5,
    "total": 24.5
  },
  {
    "name": "Kramundsen trekking poles",
    "subtotal": 24.5,
    "total": 13.475000000000001
  }
]

Precis som med andra frågeoperatorer exkluderar operatorn ? objekt om de refererade egenskaperna saknas eller om de typer som jämförs skiljer sig.

Coalesce-operator

Använd operatorn ?? för att effektivt söka efter en egenskap i ett objekt när du kör frågor mot halvstrukturerade eller blandade data.

Example

Den här frågan förutsätter att alla objekt där collapsible egenskapen inte finns inte är komprimerbara:

SELECT
    p.name,
    p.collapsible ?? false AS isCollapsible
FROM
    products p