【问题标题】:SQL replace all specified keysSQL 替换所有指定的键
【发布时间】:2020-01-12 08:58:12
【问题描述】:

我有一列(varchar)在一个表中只包含 json 字符串。我想在该列上用“”替换所有键。我怎样才能使用 sql 做到这一点?我的数据库是 MySQL。

例如:

|--------------------------------------------------------------------|
|                            t_column                                |                  
|--------------------------------------------------------------------|
| {"name":"mike","email":"xxx@example.com","isManage":false,"age":22}|
|--------------------------------------------------------------------|
SELECT replace(t_column, regexp, "") FROM t_table

我希望: mikexxx@example.comfalse22

regexp 怎么写?

【问题讨论】:

  • 为什么不用JSON类型?
  • 因为我想要搜索基于关键字的 JSON 值并验证该关键字是否存在于 JSON 的值中。但我不知道 JSON 有多少个键,因为每条记录都有不同类型的 JSON 形式。
  • 姓名、电子邮件、isManage 和年龄是唯一的键吗?
  • 不,我在该列中有不同的 JSON 格式。
  • 构建组合非结构化字符串的用例是什么?

标签: mysql sql json regex replace


【解决方案1】:

如果你真的想用你的方法解决问题,那么问题就变成了

从字符串{"name":"mike","email":"xxx@example.com","isManage":false,"age":22} 中选择所有不需要的文本 的正则表达式是什么?

那么答案是:{\"name\":\"|\"email\":\"|\",\"isManage\":|,\"age\":|}

但是正如其他人让你注意到的那样,我实际上会解决解析 JSON 的问题。查找functions json_value and json_query

希望我能帮上忙

PS:密切注意我是如何构建粗体句子的。任何不同都会改变问题。

编辑: 如果您想要一个更通用的表达式,例如 选择所有不是 json 格式字符串上的值的文本,您可以使用这个:

{|",|"\w+\":|"|,|}

【讨论】:

  • 感谢您的回复。我有多种 json 形式而不是这种形式。因此,您的正则表达式不匹配所有大小写。
【解决方案2】:

我可能把它写得太简单了,但这只是基于您的评论的模型。如果符合您的要求,我可以将其形式化为查询。

假设您将 JSON 字符串转换为这种格式,您可以在其中替换所有双引号和大括号,然后在末尾添加一个逗号。玩过replaceconcat_ws 之后,你现在剩下:

姓名:mike,email:xxx@example.com,isManage:false,age:22,

使用这种格式,现在每个值前面都有一个分号,后面是一个逗号,这对于键来说是不正确的。假设您现在想查看此 JSON 字符串中是否包含值“mike”。这个,你可以实现使用

select * from your_table where json_col like '%:mike,%';

【讨论】:

    【解决方案3】:

    开始
    select t_column->'$.*' from test
    

    这将返回一个属性值的 JSON 数组:

    [22, "mike", "xxx@example.com", false]
    

    这可能已经是您所需要的,您可以尝试类似

    select *
    from test
    where t_column->'$.*' like '%mike%';
    

    不幸的是,似乎没有本地方法可以将数组值连接到像JSON_ARRAY_CONCAT() 这样的单个字符串。在 MySQL 8.0 中,您可以尝试 REGEXP_REPLACE() 并去除所有 JSON 字符:

    select regexp_replace(t_column->'$.*', '[" ,\\[\\]]', '') from test
    

    这将返回'22mikexxx@example.comfalse'

    如果值可以包含这些字符之一,它们也将被删除。

    注意:这不是很可靠。但这就是我能以“简单”的方式做的所有事情。

    db-fiddle 上查看演示。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-13
      • 1970-01-01
      • 2013-12-13
      • 2017-03-05
      • 2016-01-01
      相关资源
      最近更新 更多