다음을 통해 공유


JSON_QUERY(Transact-SQL)

적용 대상:Microsoft Fabric의 MicrosoftFabric SQL Database에 있는 Microsoft Fabric Warehouse의 SQL Server 2016(13.x) 이상 버전 Azure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSQL 분석 엔드포인트

구문은 JSON_QUERY JSON 문자열에서 개체 또는 배열을 추출합니다.

개체 또는 배열 대신 JSON 문자열에서 스칼라 값을 추출하려면 JSON_VALUE 참조하세요. 차이점 JSON_VALUEJSON_QUERY대한 자세한 내용은 JSON_VALUE 및 JSON_QUERY 비교를 참조하세요.

Transact-SQL 구문 표기 규칙

Syntax

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

Arguments

expression

식입니다. 일반적으로 JSON 텍스트를 포함하는 변수 또는 열의 이름입니다.

JSON_QUERY로 식별된 값을 찾기 전에 에서 유효하지 않은 JSON을 찾으면 함수는 오류를 반환합니다. JSON_QUERY 경로로 식별된 값을 찾지 못하면 전체 텍스트를 검색하고 에서 유효하지 않은 JSON을 찾으면 오류를 반환합니다.

path

추출할 개체 또는 배열을 지정하는 JSON 경로입니다.

SQL Server 2017(14.x) 및 Azure SQL Database에서 변수를 경로 값으로 제공할 수 있습니다.

JSON 경로는 구문 분석을 위해 lax 또는 strict 모드를 지정할 수 있습니다. 구문 분석 모드를 지정하지 않으면 lax 모드가 기본값입니다. 자세한 내용은 SQL Database 엔진의 JSON 경로 식을 참조하세요.

경로의 기본값은 .입니다$. 따라서 경로JSON_QUERY에 대한 값을 제공하지 않으면 입력 식을 반환합니다.

경로 형식이 유효 JSON_QUERY 하지 않으면 오류를 반환합니다.

배열 래퍼와 함께

Note

WITH ARRAY WRAPPER 현재 미리보기 상태이며 SQL Server 2025(17.x)에서만 사용 가능합니다.

ANSI SQL JSON_QUERY 함수는 현재 지정된 경로에서 JSON 개체 또는 배열을 반환하는 데 사용됩니다. SQL Server 2025(17.x)에서 도입된 SQL/JSON 경로 표현식에서 배 열 와일드카드 지원이 있어, JSON_QUERY 각 요소가 JSON 객체인 JSON 배열 내 요소의 지정된 속성을 반환하는 데 사용할 수 있습니다. 와일드카드 검색은 여러 값을 반환할 수 있으므로 JSON 쿼리 식에 와일드카드 또는 범위 또는 목록이 있는 SQL/JSON 경로 식과 함께 절을 지정 WITH ARRAY WRAPPER 하여 값을 JSON 배열로 반환합니다. WITH ARRAY WRAPPER 절은 입력이 json 형식인 경우에만 지원됩니다.

다음 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"
        }
    ]
}';

경로 $.credit_cards 는 각 요소가 유효한 JSON 개체인 JSON 배열을 가리킵니다. JSON_QUERY 이제 배열 와일드카드 지원과 함께 함수를 사용하여 다음과 같은 속성의 type 모든 또는 특정 값을 반환할 수 있습니다.

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

다음 표에서는 와일드카드가 있는 SQL/JSON 경로 식과 다음을 사용하는 반환 값의 다양한 예제를 JSON_QUERY WITH ARRAY WRAPPER보여 줍니다.

Path 반환 값
$.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"]

반환 값

nvarchar(max) 형식의 JSON 조각을 반환합니다. 반환된 값의 데이터 정렬은 입력된 식의 데이터 정렬과 동일합니다.

값이 개체 또는 배열이 아닌 경우:

  • lax 모드에서는 JSON_QUERY이(가) null을 반환합니다.

  • strict 모드에서는 JSON_QUERY이(가) 오류를 반환합니다.

Remarks

lax 모드와 strict 모드

다음 JSON 텍스트를 살펴보십시오.

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

다음 표에서는 lax 모드 및 strict 모드에서 JSON_QUERY의 동작을 비교합니다. 선택적 경로 모드 사양(lax 또는 strict)에 대한 자세한 내용은 SQL Database 엔진의 JSON 경로 식을 참조하세요.

Path lax 모드에서 값을 반환합니다. strict 모드에서 값을 반환합니다. 추가 정보
$ 전체 JSON 텍스트를 반환합니다. 전체 JSON 텍스트를 반환합니다.
$.info.type NULL Error 개체 또는 배열이 아닙니다.

대신 JSON_VALUE를 사용하세요.
$.info.address.town NULL Error 개체 또는 배열이 아닙니다.

대신 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 배열이 아닙니다.
$.info.none NULL Error 속성이 없습니다.

FOR JSON과 함께 JSON_QUERY 사용

JSON_QUERY는 유효한 JSON 조각을 반환합니다. 따라서 FOR JSONJSON_QUERY 반환 값에서 특수 문자를 이스케이프하지 않습니다.

FOR JSON을 사용하여 결과를 반환하고 이미 JSON 형식의 데이터를 포함하는 경우(열 또는 식의 결과로) JSON_QUERY 매개 변수 없이 JSON 데이터를 래핑합니다.

Examples

A. JSON 조각 반환

다음 예에서는 쿼리 결과의 CustomFields 열에서 JSON 조각을 반환하는 방법을 보여줍니다.

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

B. FOR JSON 출력에 JSON 조각 포함

다음 예에서는 FOR JSON 절의 출력에 JSON 조각을 포함하는 방법을 보여줍니다.

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

C. JSON_QUERY 함수와 함께 WITH ARRAY WRAPPER 사용

다음 예제에서는 함수를 사용하여 WITH ARRAY WRAPPERJSON_QUERY 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;

결과 집합은 다음과 같습니다.

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