1

我尝试使用JSON_VALUEinsideGROUP_BY子句并收到此错误:

JSON 文本格式不正确。在位置 0 处发现了意外的字符“b”。

当我只在 中使用它时SELECT,我得到了预期的结果。

SELECT 
    COUNT(*),
    Date,
    JSON_VALUE(msg, '$.a')
FROM
    requests
GROUP BY 
    Date, JSON_VALUE(msg, '$.a')
4

1 回答 1

0

看来,msg列中存储了一个无效的 JSON。但你可以尝试改变你的说法。

桌子:

CREATE TABLE requests (
   [Date] date,
   [Msg] nvarchar(1000)
)
INSERT INTO requests ([Date], [Msg])
VALUES
   ('20201020', N'{"m":"GET","a":"/Login.aspx"}'),
   ('20201020', N'{"m":"GET","a":"/Login.aspx"}'),
   ('20201020', N'{"m":"GET","a":"/Login.aspx"}'),
   ('20201021', N'{"m":"GET","a":"/Login.aspx"}'),
   ('20201021', N'{b:"GET","a":"/Login.aspx"} ')

陈述:

SELECT 
   COUNT(*) AS [Count], 
   [Date], 
   CASE WHEN ISJSON([Msg]) = 1 THEN JSON_VALUE([Msg], '$.a') END AS Msg
FROM requests
GROUP BY [Date], CASE WHEN ISJSON([Msg]) = 1 THEN JSON_VALUE([Msg], '$.a') END

结果:

Count   Date        Msg
1       2020-10-21  
3       2020-10-20  /Login.aspx
1       2020-10-21  /Login.aspx

作为附加说明,如果要获取具有无效 JSON 内容的行,请执行以下语句:

SELECT * 
FROM request 
WHERE ISJSON([Msg]) = 0
于 2020-10-22T13:40:07.743 回答