Ao usar JSON com SQL Server, você pode usar o
JSON_QUERY()
função para extrair um objeto ou uma matriz de uma string JSON. Para usar essa função, você fornece a expressão JSON como argumento. Você também pode fornecer um segundo argumento (opcional) para especificar o objeto ou array a ser extraído.
Sintaxe
A sintaxe fica assim:
JSON_QUERY ( expressão [ , caminho ] )
Onde
expression
é a expressão de string JSON e path
é o objeto ou array que você deseja extrair dessa expressão. O path
argumento é opcional (se você não o fornecer, todo o documento JSON será retornado). O argumento de caminho (se fornecido) pode incluir um modo de caminho opcional componente. Este modo de caminho opcional pode ser um valor de
lax
ou strict
. Esse valor determina o que acontece caso o caminho fornecido seja inválido. O modo de caminho (se fornecido) vem antes do cifrão. Exemplo 1 – Uso básico
Aqui está um exemplo para demonstrar o uso básico do
JSON_QUERY()
função. DECLARE @data NVARCHAR(4000)SET @data=N'{ "Cities":[ { "Name":"Cabul", "CountryCode":"AFG", "Distrito":"Kabol", "Population" :1780000 }, { "Name":"Qandahar", "CountryCode":"AFG", "Distrito":"Qandahar", "Population":237500 } ]}'SELECT JSON_QUERY(@data, '$.Cities[0 ]') AS 'Resultado';
Resultado:
+----------+| Resultado ||----------|| { "Nome":"Cabul", "CountryCode":"AFG", "Distrito":"Cabol", "População":1780000 } |+----------+
Neste exemplo, primeiro declaro e defino uma variável chamada
@data
. Em seguida, atribuo uma matriz a essa variável. Depois de fazer isso, executo uma consulta nesse array. Neste caso eu uso
Cities[0]
para fazer referência ao primeiro item na matriz (as matrizes JSON usam numeração baseada em zero). Eu poderia acessar o segundo item usando
Cities[1]
. Assim:DECLARE @data NVARCHAR(4000)SET @data=N'{ "Cities":[ { "Name":"Cabul", "CountryCode":"AFG", "Distrito":"Kabol", "Population" :1780000 }, { "Name":"Qandahar", "CountryCode":"AFG", "Distrito":"Qandahar", "Population":237500 } ]}'SELECT JSON_QUERY(@data, '$.Cities[1 ]') AS 'Resultado';
Resultado:
+----------+| Resultado ||----------|| { "Nome":"Qandahar", "CountryCode":"AFG", "Distrito":"Qandahar", "População":237500 } |+----------+
Exemplo 2 – Retornar toda a expressão JSON
O segundo argumento é opcional, portanto, se você o omitir, todo o documento JSON será retornado. Veja o que acontece quando fazemos isso usando os mesmos dados dos exemplos anteriores:
DECLARE @data NVARCHAR(4000)SET @data=N'{ "Cities":[ { "Name":"Cabul", "CountryCode":"AFG", "Distrito":"Kabol", "Population" :1780000 }, { "Name":"Qandahar", "CountryCode":"AFG", "Distrito":"Qandahar", "Population":237500 } ]}'SELECT JSON_QUERY(@data) AS 'Result';
Resultado:
+----------+| Resultado ||----------|| { "Cities":[ { "Name":"Cabul", "CountryCode":"AFG", "Distrito":"Kabol", "Population":1780000 }, { "Name":"Qandahar", "CountryCode" :"AFG", "Distrito":"Qandahar", "População":237500 } ]} |+----------+Exemplo 3 – Um exemplo de banco de dados
Se pudéssemos colocar os dados do exemplo anterior em um banco de dados, poderíamos reescrever a consulta da seguinte forma:
SELECT JSON_QUERY(Document,'$.Cities[0]') AS 'City 1'FROM Json_Documents
Resultado:
+----------+| Cidade 1 ||----------|| { "ID":1, "Nome":"Cabul", "CountryCode":"AFG", "Distrito":"Cabol", "População":1780000 } |+----------+
Isso pressupõe que o documento JSON seja armazenado em uma coluna chamadaDocument
, que está em uma tabela chamadaJson_Documents
.
Exemplo 4 – Valores escalares
OJSON_QUERY()
A função não foi projetada para retornar valores escalares. Se você quiser retornar um valor escalar, use oJSON_VALUE()
função em vez disso.
No entanto, não há nada que impeça você de combinar as duas funções em uma consulta para retornar dados em vários níveis de granularidade.
Aqui está um exemplo:
DECLARE @data NVARCHAR(4000)SET @data=N'{ "Suspeito":{ "Nome":"Homer Simpson", "Hobbies":["Comer", "Dormir", "Base Jumping"] } }' SELECT JSON_VALUE(@data,'$.Suspect.Name') AS 'Nome', JSON_QUERY(@data,'$.Suspect.Hobbies') AS 'Hobbies', JSON_VALUE(@data,'$.Suspect.Hobbies [2]') COMO 'Último Hobby';
Resultado:
+---------------+----------------------------- ----------+--------------+| Nome | Passatempos | Último Hobby ||---------------+------------------------------ ----------+--------------|| Homer Simpson | ["Comer", "Dormir", "Base Jumping"] | Base Jumping |+---------------+------------------------------ ----------+--------------+
Neste exemplo eu useiJSON_VALUE()
para extrair vários valores escalares, mas também useiJSON_QUERY()
para retornar um array inteiro (queJSON_VALUE()
não pode fazer).
Exemplo 5 – Modo de caminho
Como mencionado, você também tem a opção de especificar o modo de caminho. Isso pode serlax
oustrict
.
O valor do modo de caminho determina o que acontece quando a expressão de caminho contém um erro. Especificamente:
- Em relaxado modo, a função retornará valores vazios se a expressão de caminho contiver um erro. Por exemplo, se você solicitar o valor $.name , e o texto JSON não contém um nome key, a função retorna null, mas não gera um erro.
-
Em estrito modo, a função gera um erro se a expressão de caminho contiver um erro.
O valor padrão é
lax
. Aqui está um exemplo para demonstrar a diferença entre esses dois modos.
Erro no modo lax
Aqui está o que acontece quando a expressão de caminho contém um erro no modo lax.
SELECT JSON_QUERY('{"Nome":"Bruce"}', 'lax $.Nome') AS 'Resultado';
Resultado:
+----------+| Resultado ||----------|| NULL |+----------+
Neste exemplo, estamos tentando retornar um valor escalar, mas
JSON_QUERY()
não faz valores escalares. Como mencionado, ele retorna apenas objetos e arrays. Nesse caso, obtemos um valor nulo (porque estamos usando o modo lax). Erro no modo estrito
Aqui está o que acontece quando executamos o mesmo código no modo estrito.
SELECT JSON_QUERY('{"Name":"Bruce"}', 'strict $.Name') AS 'Result';
Resultado:
Msg 13624, Level 16, State 2, Line 1Object ou array não podem ser encontrados no caminho JSON especificado.
Conforme esperado, o modo estrito resulta em uma mensagem de erro explicando o erro.