Удалите квадратные и фигурные скобки из столбца объединенной таблицы на сервере Microsoft SQL

Я использую сервер Microsoft SQL v14.0.1000. Я использую приведенный ниже запрос для преобразования результата моего запроса в JSON:

SELECT TOP(5) dn.id AS ID,
       dn.EventTimeStamp AS EventTimeStamp,
       dn.ControllerId AS ControllerID,
       JSON_QUERY((SELECT ControllerName
                     FROM Controllers
                    WHERE dn.ControllerId = Controllers.ControllerID
                      FOR JSON PATH, without_array_wrapper)) AS ControllerName
  FROM DashboardNotifications dn
 ORDER BY dn.ID DESC
   FOR JSON PATH

И в результате получаем следующий JSON:

[
  {
    "ID": 354,
    "EventTimeStamp": "2022-05-17T05:35:25",
    "ControllerId": 24,
    "ControllerName": {
      "ControllerName": "P25-SC-0233"
    }
  },
  {
    "ID": 353,
    "EventTimeStamp": "2022-05-17T05:34:20",
    "ControllerId": 17,
    "ControllerName": {
      "ControllerName": "P25-SC-0226"
    }
  },
  {
    "ID": 352,
    "EventTimeStamp": "2022-05-17T05:33:50",
    "ControllerId": 16,
    "ControllerName": {
      "ControllerName": "P25-SC-0225"
    }
  }
]

Я смог удалить квадратные скобки из

"ControllerName":[{"ControllerName":"P25-SC-0233"}],

хотя мой желаемый результат:

[
  {
    "ID": 354,
    "EventTimeStamp": "2022-05-17T05:35:25",
    "ControllerId": 24,
    "ControllerName": "P25-SC-0233"
  },
  {
    "ID": 353,
    "EventTimeStamp": "2022-05-17T05:34:20",
    "ControllerId": 17,
    "ControllerName": "P25-SC-0226"
  },
  {
    "ID": 352,
    "EventTimeStamp": "2022-05-17T05:33:50",
    "ControllerId": 16,
    "ControllerName": "P25-SC-0225"
  }
]

Какие изменения мне нужно внести, чтобы удалить вложенный ключ ControllerName?

Просто удалите json_query, нет?

Salman A 17.05.2022 14:51

@Salman Удаление json_query фактически даст "ControllerName":"{\"ControllerName\":\"P25-SC-0233\"}"

saurabh 17.05.2022 14:54

Трудно сказать без схемы таблицы, но кажется, что вы должны присоединяться к контроллерам, а не оборачивать их в подзапрос.

AlwaysLearning 17.05.2022 14:59

@AlwaysLearning Клянусь, это не сработало, когда я пытался присоединиться ранее, лол.... Сейчас это работает, может быть, на этот раз я внес некоторые изменения. Спасибо, что заставил меня попробовать присоединиться еще раз :D

saurabh 17.05.2022 15:05

удалите json_query И for json внутри подзапроса. Или, возможно, использовать боковое соединение. К сожалению, вы не предоставили работающий пример, иначе было бы проще.

Salman A 17.05.2022 15:52
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
5
38
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Я думаю, вам просто нужен подзапрос без FOR JSON (и тогда вам не нужно JSON_QUERY, чтобы избежать его)

SELECT TOP(5) dn.id AS ID,
       dn.EventTimeStamp AS EventTimeStamp,
       dn.ControllerId AS ControllerID,
       (
           SELECT c.ControllerName
             FROM Controllers c
            WHERE dn.ControllerId = c.ControllerID
       ) AS ControllerName
  FROM DashboardNotifications dn
 ORDER BY dn.ID DESC
   FOR JSON PATH;

Ensure your subquery is guaranteed to return a maximum of one row

Вы также можете просто использовать соединение

SELECT TOP(5) dn.id AS ID,
       dn.EventTimeStamp,
       dn.ControllerId,
       c.ControllerName
  FROM DashboardNotifications dn
  LEFT JOIN
       Controllers c ON dn.ControllerId = c.ControllerID
 ORDER BY dn.ID DESC
   FOR JSON PATH;

Это то, что мне нужно. Хотя я пробовал что-то похожее на оба этих подхода, прежде чем использовать json_query. Должно быть, совершил какую-то глупую ошибку. Забавно, теперь я не могу воспроизвести ошибку, которую я сделал.

saurabh 17.05.2022 19:30

Теперь возникла проблема, я фактически использовал For JSON AUTO в конце ранее вместо JSON PATH, запрос был точно таким же, как ваш запрос на соединение.

saurabh 17.05.2022 19:36

Совершенно не обязательно json_query. Измените запрос на:

SELECT TOP(5) dn.id AS ID, dn.EventTimeStamp AS EventTimeStamp, dn.ControllerId AS ControllerID, (
    SELECT ControllerName FROM Controllers WHERE dn.ControllerId = Controllers.ControllerID
) AS ControllerName
FROM DashboardNotifications dn
ORDER BY dn.ID DESC
FOR JSON PATH

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