您可以直接在db表中查询JSON内容吗

时间:2019-06-17 22:12:06

标签: json sql-server

无法从表中存储的JSON数据中提取有用的信息。

我在SQL Server表中存储了JSON数据,我想访问一个或两个元素以检查值等。我的表定义如下:

CREATE TABLE [Events].[events](
    [eventID] [int] IDENTITY(1,1) NOT NULL,
    [eventType] [smallint] NOT NULL,
    [eventDate] [datetime] NOT NULL,
    [eventMetaData] [nvarchar](max) NULL,
    CONSTRAINT [PK_events] PRIMARY KEY CLUSTERED 
    (
        [eventID] ASC
    ) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

将JSON数据保存在eventMetaData列中。

eventMetaData列存储数据如下:

[{
    "jn": "jn1",
    "src": "client123",
    "id": 649
}]

,我想尝试提取此信息以显示在页面上。

到目前为止,尽管我相信我应该使用的JSON_VALUE字符串,但我已经尝试使用JSON_QUERYJSON_VALUE方法来提取所需的字符串。

SELECT top 10 eventId, eventDate, 
 JSON_VALUE(eventData,'$.jn') AS jn
from events
WHERE ISJSON(eventData)>0
order by eventdate desc

运行此命令时,我会获得eventID和eventDate,但在jn col中始终会得到NULL。

一些帖子显示了数据位于nvarchar(max)类型的变量中的示例,如果我将JSON放入其中,它可以与我的查询一起使用,但是我确实需要它来自表,因为我需要显示多行给我的客户。

在我上面发布的示例中,我想从查询中获取eventID,eventDate和jn值,但在一分钟后,我获得了eventID和eventDate,但在jn col中始终为NULL。

最终,我希望在JSON列中拥有更多密钥,我可以访问并显示给最终用户。

2 个答案:

答案 0 :(得分:1)

我也无法使用JSON_VALUE,但是OPENJSON对我有用:

DECLARE @j NVARCHAR(255) = 
    '[{
        "jn": "jn1",
        "src": "client123",
        "id": 649
    }]'

SELECT [jn]
     , [src]
     , [id]
FROM OPENJSON(@j)
WITH (jn NVARCHAR(10) '$.jn'
    , src NVARCHAR(255) '$.src'
    , id INT '$.id'
    )

答案 1 :(得分:1)

您非常亲密。如果您的eventMetaData始终是包含一个元素的JSON数组,则可以这样使用JSON_VALUE

表格:

CREATE TABLE [events] (
    [eventID] [int] IDENTITY(1,1) NOT NULL,
    [eventType] [smallint] NOT NULL,
    [eventDate] [datetime] NOT NULL,
    [eventMetaData] [nvarchar](max) NULL
)

INSERT INTO [events] 
    (eventType, eventDate, eventMetaData)
VALUES 
    (1, '20190618', N'[{"jn": "jn1","src": "client123","id": 649}]')

T-SQL:

SELECT
   JSON_VALUE(eventMetaData, '$[0].jn') jn,
   JSON_VALUE(eventMetaData, '$[0].src') src,
   JSON_VALUE(eventMetaData, '$[0].id') id,
   *
FROM [events]   

输出:

jn  src         id  eventID eventType   eventDate           eventMetaData
jn1 client123   649 1       1           18/06/2019 00:00:00 [{"jn": "jn1","src": "client123","id": 649}]

注意:

如果您的JSON数组中还有更多项目,请将OPENJSONCROSS APPLY运算符配合使用:

CREATE TABLE [events] (
    [eventID] [int] IDENTITY(1,1) NOT NULL,
    [eventType] [smallint] NOT NULL,
    [eventDate] [datetime] NOT NULL,
    [eventMetaData] [nvarchar](max) NULL
)

INSERT INTO [events] 
    (eventType, eventDate, eventMetaData)
VALUES 
    (1, '20190618', N'[{"jn": "jn1","src": "client123","id": 649}, {"jn": "jn2","src": "client124","id": 659}]')

SELECT
   j.jn,
   j.src,
   j.id,
   e.*
FROM [events] e
CROSS APPLY OPENJSON(e.eventMetaData) WITH (
   jn nvarchar(3) '$.jn', 
   src nvarchar(50) '$.src', 
   id int '$.id'
) j