JSON_QUERY(Transact-SQL)
적용 대상: SQL Server 2016(13.x) 이상 Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics
JSON 문자열에서 개체 또는 배열을 추출합니다.
JSON 문자열에서 개체 또는 배열 대신 스칼라 값을 추출하려면 JSON_VALUE(Transact-SQL)를 참조하세요. JSON_VALUE와 JSON_QUERY
의 차이점에 대한 정보는, JSON_VALUE 및 JSON_QUERY 비교를 참조하세요.
구문
JSON_QUERY ( expression [ , path ] )
인수
expression
식입니다. 일반적으로 JSON 텍스트를 포함하는 변수 또는 열의 이름입니다.
JSON_QUERY
이(가) 경로로 식별된 값을 찾기 전에 식에서 유효하지 않은 JSON을 찾으면, 함수는 오류를 반환합니다. JSON_QUERY
이(가) 경로로 식별된 값을 찾지 못할 경우 전체 텍스트를 검사한 후 식에서 유효하지 않은 JSON을 찾으면 오류를 반환합니다.
path
추출할 개체 또는 배열을 지정하는 JSON 경로입니다.
SQL Server 2017(14.x) 및 Azure SQL Database에서 path 값으로 변수를 제공할 수 있습니다.
JSON 경로는 구문 분석을 위해 lax 또는 strict 모드를 지정할 수 있습니다. 구문 분석 모드를 지정하지 않으면 lax 모드가 기본값입니다. 자세한 내용은 JSON 경로 식(SQL Server)을 참조하세요.
path의 기본값은 ‘$’입니다. 결과적으로 경로에 값을 제공하지 않으면 JSON_QUERY
이(가) 입력된 식을 반환합니다.
경로의 형식이 유효하지 않으면 JSON_QUERY
이(가) 오류를 반환합니다.
반환 값
nvarchar(max) 형식의 JSON 조각을 반환합니다. 반환된 값의 데이터 정렬은 입력된 식의 데이터 정렬과 동일합니다.
값이 개체 또는 배열이 아닌 경우:
lax 모드에서는
JSON_QUERY
이(가) null을 반환합니다.strict 모드에서는
JSON_QUERY
이(가) 오류를 반환합니다.
설명
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)에 대한 자세한 내용은 JSON 경로 식(SQL Server)을 참조하세요.
경로 | 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 JSON은 JSON_QUERY
반환 값의 특수 문자를 이스케이프하지 않습니다.
FOR JSON을 사용하여 결과를 반환하고 이미 JSON 형식인 데이터(열 또는 식의 결과)를 포함하는 경우 경로 매개 변수 없이 JSON_QUERY
로 JSON 데이터를 래핑하세요.
예제
예 1
다음 예에서는 쿼리 결과의 CustomFields
열에서 JSON 조각을 반환하는 방법을 보여줍니다.
SELECT PersonID,FullName,
JSON_QUERY(CustomFields,'$.OtherLanguages') AS Languages
FROM Application.People
예제 2
다음 예에서는 FOR JSON 절의 출력에 JSON 조각을 포함하는 방법을 보여줍니다.
SELECT StockItemID, StockItemName,
JSON_QUERY(Tags) as Tags,
JSON_QUERY(CONCAT('["',ValidFrom,'","',ValidTo,'"]')) ValidityPeriod
FROM Warehouse.StockItems
FOR JSON PATH