在SQL Server 2012列中查询JSON

isu*_*mit 5 sql json sql-server-2012

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

[{"bvin":"145a7170ec1247cfa077257e236fad69","id":"b06f6aa5ecd84be3aab27559daffc3a4"}]
Run Code Online (Sandbox Code Playgroud)

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

select * 
from tb1 
left join tb2 on tb1.(this bvin inside my column) = tb2.bvin.
Run Code Online (Sandbox Code Playgroud)

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

jos*_*aly 6

另一个解决方案是JSON Select,它提供了一个JsonNVarChar450()函数.您的示例将如此解决:

select * 
from tb1 
left join tb2 on dbo.JsonNVarChar450(tb1.YourColumnName, 'bvin') = tb2.bvin
Run Code Online (Sandbox Code Playgroud)

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

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

go

create index IX_tb2_bvin on tb2(bvin)
Run Code Online (Sandbox Code Playgroud)

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

select * 
from tb1 
left join tb2 on tb1.bvin = tb2.bvin
Run Code Online (Sandbox Code Playgroud)

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


ars*_*in3 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":"')
    )
Run Code Online (Sandbox Code Playgroud)

可悲的是,这很容易.

  • @bvj:将外键存储在json数据的`varchar`列中,​​在连接表之前必须对其进行解析,使查询非常复杂,并且无法对其进行索引.在`varchar`上连接表也比`int`慢得多 (5认同)
  • @ arserbin3我知道作者问的问题是Sql Server 2012,但只是想指出PostgreSQL允许以有效的方式索引和查询Json. (2认同)