JSON_VALUE(Transact-SQL)
적용 대상: SQL Server 2016(13.x) 이상 Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics
JSON 문자열에서 스칼라 값을 추출합니다.
스칼라 값 대신 JSON 문자열에서 개체 또는 배열을 추출하려면 JSON_QUERY(Transact-SQL)를 참조하세요. JSON_VALUE
와(과) JSON_QUERY
의 차이점에 대한 정보는, JSON_VALUE 및 JSON_QUERY 비교를 참조하세요.
구문
JSON_VALUE ( expression , path )
인수
expression
식입니다. 일반적으로 JSON 텍스트를 포함하는 변수 또는 열의 이름입니다.
JSON_VALUE
이(가) 경로로 식별된 값을 찾기 전에 식에서 유효하지 않은 JSON을 찾으면, 함수는 오류를 반환합니다. JSON_VALUE
이(가) 경로로 식별된 값을 찾지 못할 경우 전체 텍스트를 검사한 후 식에서 유효하지 않은 JSON을 찾으면 오류를 반환합니다.
path
추출할 속성을 지정하는 JSON 경로입니다. 자세한 내용은 JSON 경로 식(SQL Server)을 참조하세요.
SQL Server 2017(14.x) 및 Azure SQL Database에서 path 값으로 변수를 제공할 수 있습니다.
경로의 형식이 유효하지 않으면 JSON_VALUE
이(가) 오류를 반환합니다.
반환 값
nvarchar(4000) 형식의 단일 텍스트 값을 반환합니다. 반환된 값의 데이터 정렬은 입력된 식의 데이터 정렬과 동일합니다.
값이 4000자를 초과하는 경우:
lax 모드에서는
JSON_VALUE
이(가)NULL
를 반환합니다.strict 모드에서는
JSON_VALUE
이(가) 오류를 반환합니다.
4000자보다 큰 스칼라 값을 반환해야 하는 경우 대신 사용합니다 OPENJSON
JSON_VALUE
. 자세한 내용은 OPENJSON(Transact-SQL)을 참조하세요.
JSON 함수는 JSON 문서가 varchar, nvarchar로 저장되든 네이티브 json 데이터 형식으로 저장되든 동일하게 작동합니다.
설명
lax 모드와 strict 모드
다음 JSON 텍스트를 살펴보십시오.
DECLARE @jsonInfo NVARCHAR(MAX)
SET @jsonInfo=N'{
"info":{
"type":1,
"address":{
"town":"Bristol",
"county":"Avon",
"country":"England"
},
"tags":["Sport", "Water polo"]
},
"type":"Basic"
}'
다음 표에서는 lax 모드 및 strict 모드에서 JSON_VALUE
의 동작을 비교합니다. 선택적 경로 모드 사양(lax 또는 strict)에 대한 자세한 내용은 JSON 경로 식(SQL Server)을 참조하세요.
경로 | lax 모드에서 값을 반환합니다. | strict 모드에서 값을 반환합니다. | 추가 정보 |
---|---|---|---|
$ | NULL |
Error | 스칼라 값이 아닙니다. 대신 JSON_QUERY 를 사용하세요. |
$.info.type | N'1' | N'1' | 해당 사항 없음 |
$.info.address.town | N'Bristol' | N'Bristol' | 해당 사항 없음 |
$.info."address" | NULL |
Error | 스칼라 값이 아닙니다. 대신 JSON_QUERY 를 사용하세요. |
$.info.tags | NULL |
Error | 스칼라 값이 아닙니다. 대신 JSON_QUERY 를 사용하세요. |
$.info.type[0] | NULL |
Error | 배열이 아닙니다. |
$.info.none | NULL |
Error | 속성이 없습니다. |
예제
예 1
다음 예에서는 쿼리 결과에서 JSON 속성 town
및 state
의 값을 사용합니다. JSON_VALUE
은(는) 원본의 데이터 정렬을 유지하므로 결과의 정렬 순서는 jsonInfo
열의 데이터 정렬에 따라 다릅니다.
참고 항목
(이 예제에서는 Person.Person
이라는 테이블에 JSON 텍스트의 jsonInfo
열이 포함되어 있고, 이 열에는 이전에 lax 모드 및 strict 모드에 대해 설명한 것과 같은 구조가 있다고 가정합니다. AdventureWorks
샘플 데이터베이스에서 Person
테이블에는 실제로 jsonInfo
열이 포함되어 있지 않습니다.)
SELECT FirstName, LastName,
JSON_VALUE(jsonInfo,'$.info.address.town') AS Town
FROM Person.Person
WHERE JSON_VALUE(jsonInfo,'$.info.address.state') LIKE 'US%'
ORDER BY JSON_VALUE(jsonInfo,'$.info.address.town')
예제 2
다음 예에서는 JSON 속성 town
의 값을 로컬 변수로 추출합니다.
DECLARE @jsonInfo NVARCHAR(MAX)
DECLARE @town NVARCHAR(32)
SET @jsonInfo=N'{"info":{"address":[{"town":"Paris"},{"town":"London"}]}}';
SET @town=JSON_VALUE(@jsonInfo,'$.info.address[0].town'); -- Paris
SET @town=JSON_VALUE(@jsonInfo,'$.info.address[1].town'); -- London
예제 3
다음 예에서는 JSON 속성 값을 기반으로 계산된 열을 만듭니다.
CREATE TABLE dbo.Store
(
StoreID INT IDENTITY(1,1) NOT NULL,
Address VARCHAR(500),
jsonContent NVARCHAR(4000),
Longitude AS JSON_VALUE(jsonContent, '$.address[0].longitude'),
Latitude AS JSON_VALUE(jsonContent, '$.address[0].latitude')
)