我从MS SQL服务器数据库导出一些数据为JSON。
从表A到表B有两个带有外键的表。它是一个0多个关系,即。表A中的记录可能在表B中有一些数据,但它没有。表A包含人员记录,表B是其当前和以前地址的列表。
我正在使用此语句来获取JSON数据:
SELECT
A.Firstname,
A.LastName,
HistoricAddresses.AddressLine1
HistoricAddresses.AddressLine2
FROM
People A
LEFT JOIN
HistoricAddresses ON HistoricAddresses.PeopleId = A.Id
FOR JSON AUTO
这会产生一个如下所示的JSON结构:
[
{
"Firstname": "xyz",
"Lastname": "xyz",
"HistoricAddresses": [
{
"AddressLine1": "abc",
"AddressLine2": "abc"
},
// more historic address records follow
]
},
// more records follow
]
这一切都很好,直到A表中的一条记录在B表中没有任何记录。在这种情况下,JSON看起来像这样:
[
{
"Firstname": "xyz",
"Lastname": "xyz",
"HistoricAddresses": [
{}
]
},
// more records follow
]
HistoricAddresses属性的内容是一个包含单个空元素的数组。它应该只是一个空数组。
有没有办法实现这个目标?
答案 0 :(得分:1)
我认为你可以使用替换方法;
SELECT REPLACE((
SELECT
A.Firstname,
A.LastName,
HistoricAddresses.AddressLine1
HistoricAddresses.AddressLine2
FROM
People A
LEFT JOIN
HistoricAddresses ON HistoricAddresses.PeopleId = A.Id
FOR JSON AUTO),'{}','')
这应该可以解决问题。
答案 1 :(得分:1)
我通过不使用LEFT JOIN而是使用子选择来解决这个问题。
而不是
SELECT
A.Firstname,
A.LastName,
HistoricAddresses.AddressLine1
HistoricAddresses.AddressLine2
FROM
People A
LEFT JOIN
HistoricAddresses ON HistoricAddresses.PeopleId = A.Id
FOR JSON AUTO
我现在正在使用
SELECT
A.Firstname,
A.LastName,
(SELECT
HistoricAddress.AddressLine1,
HistoricAddress.AddressLine2
FROM
HistoricAddress
WHERE
HistoricAddress.PeopleId = A.Id
FOR JSON AUTO) AS HistoricAddresses
FROM
People A
FOR JSON AUTO
如果没有,则完全省略HistoricAddresses JSON属性。我的解析器可以使用它。
我还没有对它进行基准测试,所以其他解决方案肯定是受欢迎的。