Sdílet prostřednictvím


JSON_QUERY (Transact-SQL)

Platí pro: SQL Server 2016 (13.x) a novější verze koncového bodu Azure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analyticsv Microsoft FabricWarehouse v databázi Microsoft FabricSQL v Microsoft Fabric

Syntaxe JSON_QUERY extrahuje objekt nebo pole z řetězce JSON.

Pokud chcete extrahovat skalární hodnotu z řetězce JSON místo objektu nebo pole, přečtěte si JSON_VALUE. Informace o JSON_VALUE rozdílch JSON_QUERY

Transact-SQL konvence syntaxe

Syntax

JSON_QUERY ( expression [ , path ] [ WITH ARRAY WRAPPER ] )

Arguments

expression

Výraz. Obvykle název proměnné nebo sloupce, který obsahuje text JSON.

Pokud JSON_QUERY najde JSON, který není ve výrazu platný, než najde hodnotu identifikovanou cestou, vrátí funkce chybu. Pokud JSON_QUERY nenajde hodnotu identifikovanou cestou, prohledá celý text a vrátí chybu, pokud najde JSON, který není platný kdekoli ve výrazu.

path

Cesta JSON, která určuje objekt nebo pole, které se má extrahovat.

V SQL Serveru 2017 (14.x) a ve službě Azure SQL Database můžete jako hodnotu cesty zadat proměnnou.

Cesta JSON může určit laxní nebo striktní režim pro analýzu. Pokud nezadáte režim analýzy, je výchozí laxní režim. Další informace najdete v tématu Výrazy cesty JSON v databázovém stroji SQL.

Výchozí hodnota pro cestu je $. V důsledku toho, pokud nezadáte hodnotu pro cestu, JSON_QUERY vrátí vstupní výraz.

Pokud formát cesty není platný, JSON_QUERY vrátí chybu.

S OBÁLKOU POLE

Note

WITH ARRAY WRAPPER je momentálně v preview a dostupný pouze v SQL Server 2025 (17.x).

Funkce ANSI SQL JSON_QUERY se v současné době používá k vrácení objektu NEBO pole JSON v zadané cestě. Díky podpoře divokých znaků pole v SQL/JSON path expression zavedené v SQL Server 2025 (17.x) JSON_QUERY lze použít k vrácení specifikovaných vlastností prvků v poli JSON, kde každý prvek je objekt JSON. Vzhledem k tomu, že vyhledávání pomocí zástupných znaků může vracet více hodnot, zadejte WITH ARRAY WRAPPER klauzuli ve výrazu dotazu JSON spolu s výrazem cesty SQL/JSON se zástupnými cardy nebo rozsahem nebo seznamem, aby se hodnoty vrátily jako pole JSON. WITH ARRAY WRAPPER klauzule je podporována pouze v případě, že vstup je typem JSON .

Podívejte se na následující dokument JSON:

DECLARE @j AS JSON = '{
    "id": 2,
    "first_name": "Mamie",
    "last_name": "Baudassi",
    "email": "mbaudassi1@example.com",
    "gender": "Female",
    "ip_address": "148.199.129.123",
    "credit_cards": [
        {
            "type": "jcb",
            "card#": "3545138777072343",
            "currency": "Koruna"
        },
        {
            "type": "diners-club-carte-blanche",
            "card#": "30282304348533",
            "currency": "Dong"
        },
        {
            "type": "jcb",
            "card#": "3585303288595361",
            "currency": "Yuan Renminbi"
        },
        {
            "type": "maestro",
            "card#": "675984450768756054",
            "currency": "Rupiah"
        },
        {
            "type": "instapayment",
            "card#": "6397068371771473",
            "currency": "Euro"
        }
    ]
}';

Cesta $.credit_cards odkazuje na pole JSON, kde každý prvek je platným objektem JSON. JSON_QUERY Nyní lze funkci použít s podporou zástupných type znaků pole k vrácení všech nebo konkrétních hodnot vlastnosti, například:

SELECT JSON_QUERY(@j, '$.credit_cards[*].type' WITH ARRAY WRAPPER);

Následující tabulka uvádí různé příklady výrazu cesty SQL/JSON se zástupným znakem a návratovou hodnotou pomocí JSON_QUERY WITH ARRAY WRAPPER.

Path Návratová hodnota
$.credit_cards[0].type ["jcb"]
$.credit_cards[*].type ["jcb","diners-club-carte-blanche","jcb","maestro","instapayment"]
$.credit_cards[0, 2].type ["jcb","jcb"]
$.credit_cards[1 to 3].type ["diners-club-carte-blanche","jcb","maestro"]
$.credit_cards[last].type ["instapayment"]
$.credit_cards[last, 0].type ["instapayment","jcb"]
$.credit_cards[last, last].type ["instapayment","instapayment"]
$.credit_cards[ 0, 2, 4].type ["jcb","jcb","instapayment"]

Návratová hodnota

Vrátí fragment JSON typu nvarchar(max).a0> Kolace vrácené hodnoty je stejná jako kolace vstupního výrazu.

Pokud hodnota není objekt nebo pole:

  • V laxném režimu JSON_QUERY vrátí hodnotu null.

  • V přísném režimu JSON_QUERY vrátí chybu.

Remarks

Laxní režim a striktní režim

Představte si následující text JSON:

{
   "info": {
      "type": 1,
      "address": {
         "town": "Cheltenham",
         "county": "Gloucestershire",
         "country": "England"
      },
      "tags": ["Sport", "Water polo"]
   },
   "type": "Basic"
}

Následující tabulka porovnává chování JSON_QUERY v laxním režimu a v přísném režimu. Další informace o volitelné specifikaci režimu cesty (lax nebo striktní) najdete v tématu Výrazy cesty JSON v databázovém stroji SQL.

Path Návratová hodnota v laxní režimu Návratová hodnota v přísném režimu Další informace
$ Vrátí celý text JSON. Vrátí celý text JSON.
$.info.type NULL Error Nejedná se o objekt nebo pole.

Místo toho použijte JSON_VALUE.
$.info.address.town NULL Error Nejedná se o objekt nebo pole.

Místo toho použijte JSON_VALUE.
$.info."address" N'{ "town":"Cheltenham", "county":"Gloucestershire", "country":"England" }' N'{ "town":"Cheltenham", "county":"Gloucestershire", "country":"England" }'
$.info.tags N'[ "Sport", "Water polo"]' N'[ "Sport", "Water polo"]'
$.info.type[0] NULL Error Ne pole.
$.info.none NULL Error Vlastnost neexistuje.

Použití JSON_QUERY s FOR JSON

JSON_QUERY vrátí platný fragment JSON. V důsledku toho FOR JSON neunikne speciálním znakům v JSON_QUERY návratové hodnotě.

Pokud vracíte výsledky ve formátu FOR JSON a zahrnete data, která jsou už ve formátu JSON (ve sloupci nebo ve výsledku výrazu), zabalte data JSON_QUERY JSON bez parametru cesty .

Examples

A. Vrácení fragmentu JSON

Následující příklad ukazuje, jak vrátit fragment JSON z CustomFields sloupce ve výsledcích dotazu.

SELECT PersonID,
       FullName,
       JSON_QUERY(CustomFields, '$.OtherLanguages') AS Languages
FROM Application.People;

B. Zahrnutí fragmentů JSON do výstupu FOR JSON

Následující příklad ukazuje, jak do výstupu klauzule FOR JSON zahrnout fragmenty JSON.

SELECT StockItemID,
       StockItemName,
       JSON_QUERY(Tags) AS Tags,
       JSON_QUERY(CONCAT('["', ValidFrom, '","', ValidTo, '"]')) AS ValidityPeriod
FROM Warehouse.StockItems
FOR JSON PATH;

C. Použití FUNKCE WITH ARRAY WRAPPER s funkcí JSON_QUERY

Následující příklad ukazuje použití WITH ARRAY WRAPPER funkce JSON_QUERY k vrácení více prvků z pole JSON:

DECLARE @j JSON = '
{"id":2, "first_name":"Mamie", "last_name":"Baudassi", "email":"mbaudassi1@example.com", "gender":"Female", "ip_address":"148.199.129.123", "credit_cards":[ {"type":"jcb", "card#":"3545138777072343", "currency":"Koruna"}, {"type":"diners-club-carte-blanche", "card#":"30282304348533", "currency":"Dong"}, {"type":"jcb", "card#":"3585303288595361", "currency":"Yuan Renminbi"}, {"type":"maestro", "card#":"675984450768756054", "currency":"Rupiah"}, {"type":"instapayment", "card#":"6397068371771473", "currency":"Euro"}]}
';
SELECT JSON_QUERY(@j, '$.credit_cards[*].type' WITH ARRAY WRAPPER ) as credit_card_types;

Tady je soubor výsledků.

credit_card_types
--------
["jcb","diners-club-carte-blanche","jcb","maestro","instapayment"]