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数据?
另一个解决方案是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的作者,因此您对使用它感兴趣:)
老实说,这是一种用于存储数据的糟糕架构,并且可能导致一些严重的性能问题.
如果你真的没有控制权来改变数据库,你可以通过解析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)
可悲的是,这很容易.
| 归档时间: |
|
| 查看次数: |
38119 次 |
| 最近记录: |