2015-07-11 234 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