我尝试使用JSON_VALUE
insideGROUP_BY
子句并收到此错误:
JSON 文本格式不正确。在位置 0 处发现了意外的字符“b”。
当我只在 中使用它时SELECT
,我得到了预期的结果。
SELECT
COUNT(*),
Date,
JSON_VALUE(msg, '$.a')
FROM
requests
GROUP BY
Date, JSON_VALUE(msg, '$.a')
我尝试使用JSON_VALUE
insideGROUP_BY
子句并收到此错误:
JSON 文本格式不正确。在位置 0 处发现了意外的字符“b”。
当我只在 中使用它时SELECT
,我得到了预期的结果。
SELECT
COUNT(*),
Date,
JSON_VALUE(msg, '$.a')
FROM
requests
GROUP BY
Date, JSON_VALUE(msg, '$.a')
看来,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