当右表中没有数据时,使用LEFT JOIN选择JSON返回单个元素数组

时间:2017-10-24 13:53:51

标签: sql-server json

我从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属性的内容是一个包含单个空元素的数组。它应该只是一个空数组。

有没有办法实现这个目标?

2 个答案:

答案 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属性。我的解析器可以使用它。

我还没有对它进行基准测试,所以其他解决方案肯定是受欢迎的。