2016-04-26 66 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