Как запросить JSON-массив безымянных объектов

У меня есть строки, содержащие Json, например: [{"Qty": 1, "Amt": 2.99},{"Qty": 3, Amt": 4.50}]

Как получить сумму Amt за строку?

Код воспроизведения:

DROP TABLE IF EXISTS dbo.SqlQueryResults;
CREATE TABLE dbo.SqlQueryResults(
  Id INT,
  Result nvarchar(max)
)
GO

INSERT INTO dbo.SqlQueryResults (Id, Result) 
VALUES 
  (1, '[{"Qty":1, "Amt":2.99}, {"Qty":3, "Amt":4.50}]'), 
  (2, '[{"Qty":2, "Amt":7.99}, {"Qty":5, "Amt":2.50}]')

SELECT * FROM dbo.SqlQueryResults;

Я застрял в выражении пути Json. В документации Выражения пути JSON (SQL Server) показаны только массивы с именем "people": [{}.{}], например

Это запрос, который у меня есть на данный момент:

SELECT Id, SUM(CAST( JSON_VALUE(Result,N'lax $.[].Amt') as decimal)) 
FROM SqlQueryResults
GROUP BY Id

Я проголосовал за вашу попытку предоставить сценарий копирования и вставки.

Gottfried Lesigang 22.04.2024 18:59
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
1
80
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

вот один из способов:

SELECT 
    id,
    sum(cast(JSON_VALUE(value, '$.Amt') as numeric(10,2))) as sum_Amt
FROM dbo.SqlQueryResults 
CROSS APPLY OPENJSON(Result)
GROUP BY id 

выход :

идентификатор sum_Amt 1 7.49 2 10.49

Перекрестное применение OPENJSON, потрясающе! Попробую, когда вернусь за компьютер

ttugates 20.04.2024 00:03

Возможно, вы захотите изучить пункт WITH в OPENJSON.

Gottfried Lesigang 22.04.2024 10:53

Вы можете попробовать OPENJSON вместе с WITH. Это возвращает приведенные и именованные столбцы вложенного JSON.

SELECT qr.Id
      ,TheJson.*
FROM dbo.SqlQueryResults qr
CROSS APPLY OPENJSON(qr.Result) 
            WITH(
                 Qty INT,
                 Amt DECIMAL(10,4)
                ) TheJson;

Чтобы решить вашу проблему:

SELECT qr.Id
      ,SUM(TheJson.Amt) SumAmt
FROM dbo.SqlQueryResults qr
CROSS APPLY OPENJSON(qr.Result) 
            WITH(Amt DECIMAL(10,4)) TheJson
GROUP BY ID;

Мне это нравится, спасибо!

ttugates 22.04.2024 15:07

Другие вопросы по теме