Eu tenho a seguinte tabela, onde [Data]
é do tipo nvarchar(max)
e seus valores são strings json válidas:
Identidade | Dados |
---|---|
1 |
{ "info" : { "done": true, "chosenOptions": ["one", "two"] } } |
2 |
{ "info" : { "done": true, "chosenOptions": ["one"] } } |
3 |
{ "info" : { "done": true, "chosenOptions": [] } } |
4 |
{ "info" : { "done": true } } |
Eu quero atualizar todas as linhas que Data
não incluem chosenOptions
, ou onde chosenOptions
é []
.
- Suponha que cada
Data
valor json tenha várias outras propriedades além das mostradas aqui, se isso for importante.
Minha consulta:
declare @defaultValue Nvarchar(100);
set @defaultValue = JSON_QUERY('["one", "two"]')
update myTable
set [Data] = JSON_QUERY(JSON_MODIFY([Data], '$.info.chosenOptions', @defaultValue))
where JSON_QUERY([data], '$.info.chosenOptions') IS NULL or
JSON_QUERY([data], '$.info.chosenOptions') = '[]'
O valor resultante chosenOptions
é uma string em vez de uma matriz (ignore o escape dos valores da matriz, isso é menos importante aqui):
Identidade | Dados |
---|---|
1 |
{ "info" : { "done": true, "chosenOptions": ["one", "two"] } } |
2 |
{ "info" : { "done": true, "chosenOptions": ["one"] } } |
3 |
{ "info" : { "done": true, "chosenOptions": "[\"one\", \"two\"]" } } <-- note que é uma string, não array |
4 |
{ "info" : { "done": true, "chosenOptions": "[\"one\", \"two\"]" } } <-- note que é uma string, não array |
Suponho que seja um comportamento esperado, mas como esse array pode ser atualizado corretamente?
JSON_QUERY
sem caminho é usado para evitar o escape de strings JSON válidas. Você precisa colocar isso diretamente dentro daJSON_MODIFY
chamada para que funcione corretamente, você não pode colocá-lo fora do parâmetro da função.Isso é apontado na documentação:
Você também pode economizar ao consultar novamente o JSON duas vezes no arquivo
WHERE
, colocando-o no arquivoCROSS APPLY
. Não fique tentado a tentar isso para oJSON_MODIFY
parâmetro, não funciona como mencioneiSQL Fiddle