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