2015-09-09 48 views
1

我有一張記錄每天遊戲的表格。球隊表包含包含JSON行一列,每一個JSON字符串還包含另一個,類似下面:寫查詢在json記錄裏面搜索,在postgreSQL裏面的另一個json裏面

--------------------------------------------------------------------- 
| id | doc               | 
--------------------------------------------------------------------- 
| 1 | {'team1':{'num':3, 'players':{'bob', 'eli', 'jack'}, 'color':'red'}, 
     'team2':{'num':3, 'players':{'a', 'eli', 'x'}, 'color':'blue'}} 

這是說TEAM1和TEAM2對每天遊戲。 我可以寫一個查詢檢索所有具有'eli'作爲播放器的記錄嗎? 感謝您的幫助

+0

我知道下面的查詢是錯誤的,但是有沒有正確的方法? 'select * from teams,json_object_keys(doc)sub(a_team),json_object_keys(json_extract_path(doc,a_team,'players'))sub(name)where name ='eli'' –

回答

1

警告 - 我纔剛剛開始使用JSON PostgreSQL的工作,所以下面的工作,但可能是次優...

那是你的實際JSON?因爲Postgresql 9.3在我嘗試導入時感到咳嗽;兩個問題,單引號,而不是雙引號,你的球員被花括號包圍,而不是方括號。

無論如何。如果我有這個權利,我用這個JSON:

create table json_table(data json); 
insert into json_table(data) 
values('{"team1":{"num":3, "players":["bob", "eli", "jack"], "color":"red"}, 
     "team2":{"num":3, "players":["a", "eli", "x"], "color":"blue"}}') 

以下查詢將工作。顯然,9.4 has some additional functions可能會讓你的生活更輕鬆。

SELECT DISTINCT teamname FROM 

    (SELECT 
    json_data.key AS teamname, 
    json_array_elements(json_data.value->'players')::text as players 
    FROM 
    json_table,json_each(data) AS json_data) 
a 

WHERE players = '"eli"'