2015-07-11 214 views
3

我有AA錶行,行中的一個具有這樣提取數據

{"name":"Richard","lastname":null,"city":"Olavarria","cityId":null} 

數據的字段,我想選擇所有的獨特的「城市」的價值觀我有。只使用mysql服務器。

可能嗎?我像這樣的東西

SELECT id FROM table_name WHERE field_name REGEXP '"key_name":"([^"]*)key_word([^"]*)"'; 

嘗試,但我不能讓正則表達式的工作提前

感謝

+0

可能需要查看一些查詢1st? – manta

+0

還沒有任何查詢 – Zuker

+0

您需要向我們展示一些作品/代碼,以便我們詳細闡述/修正。你有什麼嘗試?你會用什麼方法?到目前爲止,您的問題的答案是「這可能嗎?」:是的。 – manta

回答

7

的MySQL 5.7.7中的版本 http://mysqlserverteam.com/json-labs-release-native-json-data-type-and-binary-format/ 已經得到了JSON支持你將能夠使用jsn_extract函數來有效地解析您的JSON字符串。

如果你有一個老版本,你想純粹在mysql中解決它,那麼恐怕你不得不把它當作一個字符串,並將它的值減掉(只是普通的字符串函數或使用正則表達式) 這個是不是優雅,但它會工作

http://sqlfiddle.com/#!9/97cfd/14

SELECT 
    DISTINCT(substring(jsonfield, locate('"city":',jsonfield)+8, 
    locate('","', jsonfield, locate('"city":',jsonfield))-locate('"city":',jsonfield)-8) 
) 
FROM 
    ForgeRock 
0

見MariaDB的的Dynamic Columns

此外,搜索此論壇爲[mysql] [json];這個話題經常被討論。

2

我已經纏到這一點對於那些限制到MySQL 5.7.7 <存儲函數:

CREATE FUNCTION `json_extract_string`(
    p_json text, 
    p_key text 
) RETURNS varchar(40) CHARSET latin1 
BEGIN 
    SET @pattern = CONCAT('"', p_key, '":"'); 
    SET @start_i = LOCATE(@pattern, p_json) + CHAR_LENGTH(@pattern); 
    if @start_i = CHAR_LENGTH(@pattern) then 
     SET @end_i = 0; 
    else 
     SET @end_i = LOCATE('"', p_json, @start_i) - @start_i; 
    end if; 
    RETURN SUBSTR(p_json, @start_i, @end_i); 
END 

注意這僅適用於字符串值,但比@ DmitryK的回答更穩健一點,因爲它如果未找到密鑰並且密鑰可以位於JSON字符串中的任何位置,則返回空字符串。

+0

這是非常有限的。不包括沒有的數字「。 – styks

+0

@styks是的,它僅適用於字符串值 – thodic