如何为嵌套对象编写查询,该嵌套对象在父项的字段上有所不同?

时间:2014-06-09 21:38:29

标签: sql sql-server database-table

这可能是一个难以正确提问的问题。我的想法是,我有一个具有可能导致json对象的模式的东西:

{ id:1, x:1, y:1, type:"map" settings: {... those settings for type "map" ...}}

每个字段id, x, y, type都直接来自表格中的列。我想要的是获取type“map”的字符串,并在Map_Settings表中查找属性中的那些属性。

我也可以有一个实例:

{ id:1, x:1, y:1, type:"graph" settings: {... those settings for type "map" ...}}

其中type不同。因此,将引用Graph_Settings表。

如何编写查询来执行此操作?

1 个答案:

答案 0 :(得分:0)

我不确定如何让SQL Server生成JSON,但是你可以在XML中生成类似的东西。也许有一种方法可以将XML转换为JSON ..

我假设您的架构是这样的:

CREATE TABLE [Thing]
(
    [id] INT,
    [x] INT,
    [y] INT,
    [type] VARCHAR(10)
)

CREATE TABLE [Map_Settings]
(
    [Thing_id] INT,
    [MapSetting1] INT,
    [MapSetting2] INT
)

CREATE TABLE [Graph_Settings]
(
    [Thing_id] INT,
    [GraphSetting3] INT,
    [GraphSetting4] INT
)

一些数据:

INSERT [Thing] VALUES (1, 1, 1, 'map'), (2, 1, 1, 'graph')
INSERT [Map_Settings] VALUES (1, 0, 0)
INSERT [Graph_Settings] VALUES (2, 0, 0)

生成XML的查询:

SELECT
    thing.id AS [@id],
    thing.[x] AS [@x],
    thing.[y] AS [@y],
    thing.[type] AS [@type],
    CASE thing.[type]
        WHEN 'map' THEN
            (
                SELECT [MapSetting1] AS [@mapsetting1], [MapSetting2] AS [@mapsetting2]
                FROM [Map_Settings] ms
                WHERE ms.[Thing_id] = thing.[id]
                FOR XML PATH ('settings'), TYPE
            )
        WHEN 'graph' THEN
            (
                SELECT [GraphSetting3] AS [@graphsetting3], [GraphSetting4] AS [@graphsetting4]
                FROM [Graph_Settings] gs
                WHERE gs.[Thing_id] = thing.[id]
                FOR XML PATH ('settings'), TYPE
            )
    END
FROM [Thing] thing
FOR XML PATH ('Thing')

输出:

<Thing id="1" x="1" y="1" type="map">
  <settings mapsetting1="0" mapsetting2="0" />
</Thing>
<Thing id="2" x="1" y="1" type="graph">
  <settings graphsetting3="0" graphsetting4="0" />
</Thing>

这有帮助吗?