json字符串上的SQL服务器查询统计信息

时间:2014-07-18 13:48:59

标签: sql sql-server json

我有这个举行比赛参与的SQL Server数据库。在Participation表中,我有各种字段和一个名为ParticipationDetails的特殊字段。它是varchar(MAX)。该字段用于以json格式输入所有比赛特定数据。示例行:

Id,ParticipationDetails
1,"{'Phone evening': '6546546541', 'Store': 'StoreABC', 'Math': '2', 'Age': '01/01/1951'}"
2,"{'Phone evening': '6546546542', 'Store': 'StoreABC', 'Math': '2', 'Age': '01/01/1952'}"
3,"{'Phone evening': '6546546543', 'Store': 'StoreXYZ', 'Math': '2', 'Age': '01/01/1953'}"
4,"{'Phone evening': '6546546544', 'Store': 'StoreABC', 'Math': '3', 'Age': '01/01/1954'}"

我试图让查询运行,这会产生这样的结果:

Store, Count
StoreABC, 3
StoreXYZ, 1

我以前运行此查询:

SELECT TOP (20) ParticipationDetails, COUNT(*) Count FROM Participation GROUP BY ParticipationDetails ORDER BY Count DESC

只要我想要唯一的ParticipationDetails,这就有效。如何将其更改为"子查询"进入我的json字符串。我已经接受了这个问题,但我有点卡在这里:

SELECT 'StoreABC' Store, Count(*) Count FROM Participation WHERE ParticipationDetails LIKE '%StoreABC%'

此查询获取了我想要的特定商店的结果,但我希望商店价值为"放在那里的任何内容"。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

首先,我建议避免使用t-sql进行任何json管理,因为它本身不受支持。如果你有一个应用层,让它来管理那种格式化的数据(即.net框架和非MS框架都有json序列化器可用)。

但是,您可以使用this link中描述的函数转换json字符串。

您也可以编写自己的查询,该查询适用于字符串。像下面这样的东西:

SELECT
  T.Store,
  COUNT(*) AS [Count]
FROM
(
SELECT 
    STUFF(
        STUFF(ParticipationDetails, 1, CHARINDEX('"Store"', ParticipationDetails) + 9, ''),
            CHARINDEX('"Math"', 
                STUFF(ParticipationDetails, 1, CHARINDEX('"Store"', ParticipationDetails) + 9, '')) - 3, LEN(STUFF(ParticipationDetails, 1, CHARINDEX('"Store"', ParticipationDetails) + 9, '')), '')
        AS Store
FROM 
    Participation
) AS T
GROUP BY
  T.Store