SQL Server 2012中不使用OPENJSON查询Education[Level]='SMA'的方法
问题描述
现有JSON数据示例:
[ { "Level" : "S1", "Major" : "Teknik Informatika" }, { "Level" : "SMA", "Major" : "IPA" }, { "Level" : "SMP", "Major" : "Umum" }, { "Level" : "SD", "Major" : "Umum" } ]
以及包含JSON格式Education字段的SQL Server表数据:
| ID | UserID | Education |
|---|---|---|
| 1 | B000-1 | [{"Level":"S1","Major":"TI"},{"Level":"SMA","Major":"IPA"}] |
| 2 | B000-2 | [{"Level":"SMA","Major":"IPS"},{"Level":"SD","Major":"Umum"}] |
| 3 | B000-3 | [{"Level":"SMA","Major":"IPA"}] |
| 4 | B000-4 | [{"Level":"SD","Major":"Umum"}] |
由于使用SQL Server 2012,无法使用OPENJSON函数,需查询出Education字段中包含Level为'SMA'的记录。
解决方案
在SQL Server 2012中,只能通过字符串匹配实现需求,核心是精准匹配JSON结构中"Level":"SMA"这个键值对片段,同时避免误匹配类似"Level":"SMAN"这类情况。
基础查询语句如下:
SELECT ID, UserID, Education FROM YourTableName WHERE Education LIKE '%"Level":"SMA"%'
兼容格式差异的优化
如果JSON字符串中键名或值前后存在空格(比如"Level" : "SMA"),可以调整匹配规则兼容空格:
SELECT ID, UserID, Education FROM YourTableName WHERE Education LIKE '%"Level"%:"SMA"%'
若要兼容更多格式细节(比如键名或值使用单引号),可以用更宽松的匹配逻辑:
SELECT ID, UserID, Education FROM YourTableName WHERE Education LIKE '%["'']Level["'']%:["'']SMA["'']%'
注意
这种字符串匹配方法依赖JSON格式的稳定性,若存在嵌套JSON结构,可能出现误判,但在当前一维数组的场景下完全适用。
内容的提问来源于stack exchange,提问作者Irvan Affandy
相关产品推荐
相关产品推荐

