2016-04-26 86 views
2

随着MySQL 5.7涉及JSON的新功能出现了。这些功能之一是能够查询JSON对象中存储在数据库中的字段。查询具有JSON字段的MySQL表并访问JSON属性

我的对象看起来像这样。

{ 
"color": [ 
    {"WHITE" :{ "size": [ 
     {"S": [{"Price" : "31"}, 
       {"discountPrice" : "13" }]} 
     ]}}, 
    {"BLACK" :{ "size": [ 
     {"S": "69"}, 
     {"M": "31"}, 
     {"L": "55.666"} 
     ]}} 
]} 

我想查询它,就好像它是常规表格数据,为此我试着下面的查询无济于事。

select json_extract(Sku, '$.color[0]') from CRAWL.DAILYDATA; 

我想将其分解为看起来更像传统RDBMS的格式。

任何想法?

+0

您似乎在这里有两个问题:请详细介绍一下'无效'和'您传统的RDBMS'结果是否适用于 –

回答

1

为了将数据作为值从json对象中取出,您需要一直到这些值。举例来说,如果你想拉所有的值就像它们是常规的RDBMS列:

select json_extract(Sku, '$.color[0].WHITE.size[0].S[0].price') as price, 
json_extract(Sku, '$.color[0].WHITE.size[0].S[0].discountPrice') as discountPrice 
from CRAWL.DAILYDATA; 

当然,你需要知道你在寻找什么的对象。这是拥有像json这样的无模式对象的代价。原则上,您可以定义将使用的

json_contains_path 

json_extract 

组合,以确保你正在寻找的路径中存在一个MySQL的功能,否则返回null。就个人而言,如果你想要RDBMS的质量,为什么不把它强制成一个表格,你可以直接把值放到mysql表格中?当然,这就是为什么RDBMS存在。如果你不能把它放到这样一个表格中,你将会被困在搜索你的json中。

+0

这实际上使我确信不会为此使用JSON对象。我正在使用关系型数据库系统,但很显然,在这之间做一些事情可能是最糟糕的选择。感谢你的回答。 –

+0

非纯SQL答案是做你正在做的事情,然后使用更自然地处理JSON对象的编程语言。例如,做你的简单查询,获取你想要的对象,然后在PHP中使用json_decode。 MySQL并没有设置为以一种干净的方式处理无模式对象。过滤或分类仍然是一个挑战。 – juacala