2016-03-01 68 views
2

我在表中的列存储在格式值:删除键:从JSON字符串存储在MySQL数据库

{"field1":"val1","field2":"val4"} 
{"field1":"val2","field2":"val5"} 
{"field1":"val3","field2":"val6"} 

我需要删除所有字段1具有值(如“字段1”:” VAL1" ,‘字段1’:‘值2’,‘字段1’:‘VAL3’)和结果应该是

{"field2":"val4"} 
{"field2":"val5"} 
{"field2":"val6"} 

我想达致这通过替换,但停留在“‘字段1’:‘VAL1’ '字符串val1可以是任何值,如null,某个整数。

UPDATE emp SET col = REPLACE(col, '"field1":"val1"', '') 

由于这个val1的动态值,我被卡住了。

+0

你需要使用正则表达式来实现这一点。见[这篇文章](http://stackoverflow.com/questions/986826/how-to-do-a-regular-expression-replace-in-mysql)。但是,有些人似乎找到了解决方法。 – mikeyq6

+0

如果您使用的是PHP,您可以迭代每一行,并使用下面的代码来获取该行没有字段1 $ str ='{“field1”:“val1”,“field2”:“val4”}'; $ array = json_decode($ str); foreach($ array as $ key => $ value){ if($ key ==“field1”)continue; else echo“$ key:$ value
”; } – Rajesh

回答

0

你可以这样说:

SELECT SUBSTRING(Field, 1, INSTR(Field, '"field1"')) + SUBSTRING(Field, INSTR(Field, '"field2"'), LENGTH(Field)) FROM @Temp 

我不知道这是否正常工作,但这是观念。 (不能测试ATM)

这里是MSSQL当量(作品,只是测试!):

SELECT SUBSTRING(Field, 0, CHARINDEX('"field1"', Field)) + SUBSTRING(Field, CHARINDEX('"field2"', Field), LEN(Field)) FROM @Temp 
+1

感谢mysq Idea。 Mysql查询将会起作用,但是会在稍作更正之后:启动索引应为1.我将在更新mysql查询后接受答案。 – Abs

+0

更新谢谢你! –

3

我宁愿使用JSON_REMOVE功能(MySQL的):

UPDATE emp 
SET emp.col = JSON_REMOVE(emp.col, '$.field1'); 

您还可以添加一个WHERE子句:

WHERE emp.col LIKE '%val6%'; 

参考文献:MySQL JSON_REMOVEMySQL JSON path

博客文章举例:MySQL for your JSON

以及关于MySQL的JSON路径记:

路径属性格式名称必须增加一倍。如果属性标识符引用包含函数(空格,特殊字符,元字符)bugs.mysql.com