Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Exemplos de JSON_QUERY() no SQL Server (T-SQL)


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 chamada Document , que está em uma tabela chamada Json_Documents .

Exemplo 4 – Valores escalares


O JSON_QUERY() A função não foi projetada para retornar valores escalares. Se você quiser retornar um valor escalar, use o JSON_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 usei JSON_VALUE() para extrair vários valores escalares, mas também usei JSON_QUERY() para retornar um array inteiro (que JSON_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 ser lax ou strict .

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.