2017-05-15 84 views
1

我正在使用MySql + Python。我有一個帶json字段的MySql表。用戶可以在json對象中存儲任意數量的字段。Json搜索任意字段

例如:

{id:12, name:"a", age: 23} 
OR 
{id:5, distance: 23, distance_unit: "mile"} 

以下查詢的偉大工程:

SELECT JSON_EXTRACT(name, "$.id") as name 
FROM table 
WHERE JSON_EXTRACT(name, "$.id") > 3 

然而,當我事先知道字段名的用戶才能使用。有沒有辦法搜索任意字段?喜歡的東西:

def search(json_field) 
    magic!!! 
    if (json_field==exist) 
     return json_value 
    else: 
     return "not found" 

我不希望加載內存中的所有結果,然後使用Python,因爲它不會是有效的搜索。

回答

0

也許你正在尋找通過搜索JSON數據,而不必知道它的關鍵(即現場)?

如果是這樣,您可以嘗試JSON_SEARCH函數。如果找到匹配值,它將返回鍵名稱(字段名稱),否則返回NULL。函數的第二個參數決定您是要在所有JSON字段上執行搜索還是在第一次匹配時結束搜索。

例子:

CREATE TABLE temp1(mydata json); 
INSERT INTO temp1 values('{"id":"5", "distance":"23", "age":"23", "distance_unit":"mile"}'); 


SELECT json_search(mydata, "one", "5") AS success FROM temp1; 
-- Returns "$.id" 



SELECT json_search(mydata, "all", "23") AS success FROM temp1; 
-- Returns ["$.age", "$.distance"] 



SELECT json_search(mydata, "all", "99") AS success FROM temp1; 
-- Returns NULL 

Demo

那麼也許你可以檢查在Python代碼從查詢返回的None價值?

+0

感謝您的回覆。我不是按價值搜尋。可能有數十個可能匹配的值。我想知道在json對象中是否存在關鍵字,如果是,那麼它的價值是什麼。 – Momi

+0

我認爲在這種情況下'JSON_EXTRACT'完全符合你的要求。例如,請查看此[鏈接](http://rextester.com/WLKH42087)。使用的查詢是'SELECT TRIM(BOTH'''FROM json_extract(mydata,'$。「id''))AS test_field FROM temp1' - 它返回'5'當查詢改爲'SELECT TRIM(BOTH' 「'FROM json_extract(mydata,'$。」id1「'))AS test_field FROM temp1'(一個不存在的鍵),它返回NULL,它可以在Python代碼中再次檢查。你怎麼看? –

+0

它的工作!謝謝! – Momi