SQL Ошибка: подзапрос возвратил более 1 значения при JSON разборе - PullRequest
0 голосов
/ 30 апреля 2020

В моей базе данных json (ExtraData) сохраняется. Я хочу прочитать json и извлечь некоторые имена файлов, хранящихся там. В этом json сохраняются некоторые имена файлов изображений:

    "UploadedPictures": [
        {
          "Type": 0,
          "Filename": "9d349bf8222c4fb6a5fe883dbcd9b7b8.jpeg",
          "Description": "Image 1"
        },
        {
          "Type": 0,
          "Filename": "b2d296a4ee6c49ce80bad90339bdeec1.jpeg",
          "Description": "Image 2"
        },
        {
          "Type": 0,
          "Filename": "d088f43c1a8043cd82533f544dbc7b21.jpeg",
          "Description": "Image 3"
        }
    ],

Я хочу прочитать эти имена файлов, поскольку я получаю следующую ошибку:

Подзапрос возвратил более 1 значения , Это недопустимо, если подзапрос следует =,! =, <, <=,>,> = Или когда подзапрос используется в качестве выражения.

Мой SQL запрос:

/****** Script for SelectTopNRows command from SSMS  ******/
SELECT TOP (1000) 
    [ID]
    ,[CreatedAt]
    ,[PhoneNumber]
    ,[FirstName]
    ,[LastName]
    ,[HouseNumber]
    ,[City]
    ,[PostalCode]
    ,[Street]
    ,[ExtraData]
    ,(SELECT T.Filename 
      FROM OpenJson(JSON_QUERY([ExtraData], '$.UploadedPictures')) 
      WITH (Filename varchar(200) '$.Filename') T ) AS FileName
FROM 
    [LD].[dbo].[Database]

Однако, когда я делаю TOP(1), я получаю первое имя файла:

/****** Script for SelectTopNRows command from SSMS  ******/
SELECT TOP (1000) 
    [ID]
    ,[CreatedAt]
    ,[PhoneNumber]
    ,[FirstName]
    ,[LastName]
    ,[HouseNumber]
    ,[City]
    ,[PostalCode]
    ,[Street]
    ,[ExtraData]
    ,(SELECT TOP(1) T.Filename 
      FROM OpenJson(JSON_QUERY([ExtraData], '$.UploadedPictures')) 
      WITH (Filename varchar(200) '$.Filename') T) AS FileName
FROM 
    [LD].[dbo].[Database]

Как я могу получить все имена файлов?

1 Ответ

0 голосов
/ 30 апреля 2020

Если вы хотите проанализировать сохраненные JSON и извлечь имена файлов, вам понадобится другой оператор:

Таблица:

CREATE TABLE Data (ExtraData varchar(max))
INSERT INTO Data (ExtraData) VALUES ('{"UploadedPictures": [
        {
          "Type": 0,
          "Filename": "9d349bf8222c4fb6a5fe883dbcd9b7b8.jpeg",
          "Description": "Image 1"
        },
        {
          "Type": 0,
          "Filename": "b2d296a4ee6c49ce80bad90339bdeec1.jpeg",
          "Description": "Image 2"
        },
        {
          "Type": 0,
          "Filename": "d088f43c1a8043cd82533f544dbc7b21.jpeg",
          "Description": "Image 3"
        }
    ]}')

Оператор для анализа сохраненных JSON:

SELECT
   -- Include additional columns 
   -- d.*, 
   j.*
FROM Data d
CROSS APPLY OPENJSON(d.ExtraData, '$.UploadedPictures') WITH (
   Filename varchar(200) '$.Filename'
) j

Результат:

Filename
9d349bf8222c4fb6a5fe883dbcd9b7b8.jpeg
b2d296a4ee6c49ce80bad90339bdeec1.jpeg
d088f43c1a8043cd82533f544dbc7b21.jpeg

Если вы хотите объединить имена файлов, для SQL Server 2016 вам необходимо использовать FOR XML PATH:

SELECT 
   --d.*, 
   a.Filenames
FROM Data d
CROSS APPLY (SELECT STUFF(
    (
    SELECT CONCAT(',', Filename)
    FROM OPENJSON(d.ExtraData, '$.UploadedPictures') WITH (
        Filename varchar(200) '$.Filename'
    )
    FOR XML PATH(''), TYPE
    ).value('.', 'varchar(max)'), 1, 1, '')
) a (Filenames)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...