将密钥放入SQL Server 2017的JSON列中

问题描述 投票:0回答:2

我在SQL Server 2017中的NVARCHAR(MAX)类型的列中有这个Json:

{
    "coreTimes": {
        "TMP_CLINICAL_TIMES_ANESTHESIOLOGY_OUT_DATETIME": {
            "value": 1
        },
        "TMP_CLINICAL_TIMES_ANESTHESIOLOGY_IN_DATETIME": {
            "value": 2
        },
        "TMP_CLINICAL_TIMES_SURGICAL_OUT_DATETIME": {
            "value": 3
        },
        "TMP_CLINICAL_TIMES_ROOM_IN_DATETIME": {
            "value": 4
        },
        "TMP_CLINICAL_TIMES_ROOM_OUT_DATETIME": {
            "value": null
        },
        "TMP_CLINICAL_TIMES_BLOCK_OUT_DATETIME": {
            "value": null
        },
        "TMP_CLINICAL_TIMES_BLOCK_IN_DATETIME": {
            "value": null
        },
        "TMP_CLINICAL_TIMES_SURGICAL_IN_DATETIME": {
            "value": null
        }
    }
}

我需要这个结果:

Column
{"value":1}
{"value":2}
{"value":3}
{"value":4}
{"value":null}
{"value":null}
{"value":null}

如果json属性可以动态更改(键'coreTimes'是固定的),我可以使用什么SQL Server 2017函数来获得此结果?

在Oracle中,我使用过:

 SELECT res.*
 FROM sopinterventionsaux   ,
      JSON_TABLE ( operating_times, '$.coreTimes.*'
           COLUMNS (
              value VARCHAR2 ( 2000 ) FORMAT JSON PATH '$'
                    )
                ) res

在PostgreSQL中:

select value from table, jsonb_each(column-> 'coreTimes')

并且在SQL Server中?

sql json sql-server key nvarchar
2个回答
2
投票

如果我理解正确,则需要使用具有默认架构的OPENJSON()来解析输入JSON。在这种情况下,OPENJSON()返回具有列keyvaluetype的表:

表格:

DECLARE @json nvarchar(max) = N'{
    "coreTimes": {
        "TMP_CLINICAL_TIMES_ANESTHESIOLOGY_OUT_DATETIME": {
            "value": 1
        },
        "TMP_CLINICAL_TIMES_ANESTHESIOLOGY_IN_DATETIME": {
            "value": 2
        },
        "TMP_CLINICAL_TIMES_SURGICAL_OUT_DATETIME": {
            "value": 3
        },
        "TMP_CLINICAL_TIMES_ROOM_IN_DATETIME": {
            "value": 4
        },
        "TMP_CLINICAL_TIMES_ROOM_OUT_DATETIME": {
            "value": null
        },
        "TMP_CLINICAL_TIMES_BLOCK_OUT_DATETIME": {
            "value": null
        },
        "TMP_CLINICAL_TIMES_BLOCK_IN_DATETIME": {
            "value": null
        },
        "TMP_CLINICAL_TIMES_SURGICAL_IN_DATETIME": {
            "value": null
        }
    }
}'

CREATE TABLE Data (JsonData nvarchar(max))
INSERT INTO Data (JsonData) VALUES (@json)

声明:

SELECT j.[value]
FROM Data d
CROSS APPLY OPENJSON(d.JsonData, '$.coreTimes') j

结果:

---------------
value
---------------
{"value": 1}
{"value": 2}
{"value": 3}
{"value": 4}
{"value": null}
{"value": null}
{"value": null}
{"value": null}

如果要获得value键的确切值,则需要将OPENJSON()与显式架构(具有列定义)和其他APPLY运算符一起使用。

声明:

SELECT j2.[value]
FROM Data d
CROSS APPLY OPENJSON(d.JsonData, '$.coreTimes') j1
CROSS APPLY OPENJSON(j1.[value]) WITH ([value] int '$.value') j2

结果:

-----
value
-----
1
2
3
4
NULL
NULL
NULL
NULL

1
投票

请尝试以下:

declare @j nvarchar(max) = '{
    "coreTimes": {
        "TMP_CLINICAL_TIMES_ANESTHESIOLOGY_OUT_DATETIME": {
            "value": 1
        },
        "TMP_CLINICAL_TIMES_ANESTHESIOLOGY_IN_DATETIME": {
            "value": 2
        },
        "TMP_CLINICAL_TIMES_SURGICAL_OUT_DATETIME": {
            "value": 3
        },
        "TMP_CLINICAL_TIMES_ROOM_IN_DATETIME": {
            "value": 4
        },
        "TMP_CLINICAL_TIMES_ROOM_OUT_DATETIME": {
            "value": null
        },
        "TMP_CLINICAL_TIMES_BLOCK_OUT_DATETIME": {
            "value": null
        },
        "TMP_CLINICAL_TIMES_BLOCK_IN_DATETIME": {
            "value": null
        },
        "TMP_CLINICAL_TIMES_SURGICAL_IN_DATETIME": {
            "value": null
        }
    }
}'

select L1.[Value] from OPENJSON (@j, '$.coreTimes') AS L1
© www.soinside.com 2019 - 2024. All rights reserved.