在SQL Server 2012列中查询JSON

时间:2014-05-18 15:17:06

标签: sql json sql-server-2012

我的SQL Server 2012表中有一列包含以下Json数据。

[{"bvin":"145a7170ec1247cfa077257e236fad69","id":"b06f6aa5ecd84be3aab27559daffc3a4"}]

现在我想在我的查询中使用此列数据,如

select * 
from tb1 
left join tb2 on tb1.(this bvin inside my column) = tb2.bvin.

有没有办法在SQL Server 2012中查询JSON数据?

3 个答案:

答案 0 :(得分:5)

老实说,这是一种用于存储数据的糟糕架构,可能会导致一些严重的性能问题。

如果您真的没有控制权来更改数据库,那么可以通过解析SUBSTRING之类的值来完成此任务,但它会导致一条非常不愉快的路径:

SELECT *
FROM tb1
JOIN tb2 on tb2.bvin = 
    SUBSTRING(
        tb1.json
        ,CHARINDEX('"bvin":"', tb1.json) + LEN('"bvin":"')
        ,CHARINDEX('"', tb1.json, CHARINDEX('"bvin":"', tb1.json) + LEN('"bvin":"')) - CHARINDEX('"bvin":"', tb1.json) - LEN('"bvin":"')
    )

可悲的是,这很容易。

答案 1 :(得分:5)

另一个解决方案是JSON Select,提供JsonNVarChar450()功能。您的示例将如此解决:

select * 
from tb1 
left join tb2 on dbo.JsonNVarChar450(tb1.YourColumnName, 'bvin') = tb2.bvin

正如有人提到的,这可能有点慢,但您可以使用JSON Select函数添加索引,如下所示:

alter table tb2 add
bvin as dbo.JsonNVarChar450(YourColumnName, 'bvin') persisted

go

create index IX_tb2_bvin on tb2(bvin)

从那时起,您可以使用计算列bvin上的索引进行查询,如下所示:

select * 
from tb1 
left join tb2 on tb1.bvin = tb2.bvin

内容: 我是JSON Select的作者,因此您对使用它感兴趣:)

答案 2 :(得分:3)

请为功能here投票。在变通方法部分,您可以找到基于功能的解决方案的链接:http://www.sqlservercentral.com/articles/JSON/68128/https://www.simple-talk.com/sql/t-sql-programming/consuming-json-strings-in-sql-server/

在您的情况下,您需要合并此列中的所有值以创建数组,然后应用上面提到的变通方法功能来创建表。但是,我不认为这是一个解决方案,因为它会很慢。也许您可以在插入时将这些值分成单独的列(插入存储过程或后端方法,可能会触发..不确定您的访问权限)