【问题标题】:Save data from a field that contains json into another field of the database将包含json的字段中的数据保存到数据库的另一个字段中
【发布时间】:2015-09-11 11:54:13
【问题描述】:

我有一个 MySQL 数据库,它有两个字段。第一个字段名为postValues,另一个字段名为username。我数据库所有记录的用户名是null

postValues 字段内有一个 JSON 字符串。 在这个 JSON 字符串中可能有一个键 username

{
    otherfields,
    "username": "George",
    otherfields
}

username 也有可能不存在。

如果 JSON 字符串中存在键 username,我需要使用 SQL 查询检查数据库的每条记录,如果存在,则将其保存到字段 username 的同一记录中。请注意,otherfields 与每条记录都不相同,而且键 username 可能不在同一位置以从 JSON 字符串中获取 substr。我想我需要一个正则表达式。

谁能指导我。

【问题讨论】:

  • 使用任何脚本语言来实现这一点。首先从数据库中读取 postValue 并对其进行 json_decode 并从中获取用户名密钥并检查用户名是否存在于数据库中,插入它否则更新它
  • 我的建议是在修复过去之前先修复未来。换句话说,首先修复向您发送数据的应用程序。然后你只需要更新一次。
  • @TamilSelvan 我已经在做这个了,但是它花费的时间太长了,我可能需要在上线之前做几次测试。所以我想可能有更快的方法。
  • 哦,这是测试。优秀的。修复向您发送数据的应用程序,以便在插入记录之前解析出用户名。
  • @DanBracuk 请...这不是一个选项。有几个应用程序发送数据,这些应用程序是外部应用程序,无法更新。这是一个实时的应用程序,但我需要在更新实时数据库之前进行测试以测试数据库。该值将从现在开始直接保存。由于各种原因,我必须一遍又一遍地进行测试,这个过程需要很多时间。我希望有一个查询可以节省我一些时间。

标签: mysql sql json regex


【解决方案1】:

你可以使用mysql来判断值是否存在,毕竟JSON数据只是一个字符串。所以只要知道字符串的结构就可以搞定。

这是一个使用 REGEXP 的示例,但您也可以使用 LIKE。

SELECT (CASE WHEN `postValues` REGEXP '"username":"([a-zA-Z0-9]+)"' THEN 'YES' ELSE 'NO' END) AS `hasUserName` FROM `table`;

您还可以使用 mysql 进行更新以将名称添加到另一列。这很快就会变得非常复杂,但它确实有效。用{"bla":123,"username":"Goerge","more":"abc"}测试过

UPDATE `table` SET `username`=(
  CASE WHEN `postValues` REGEXP '"username":"([a-zA-Z0-9]+)"' THEN
    (SUBSTRING_INDEX(REPLACE(REPLACE(`postValues`,SUBSTRING_INDEX(`postValues`,'"username":"',1),''), '"username":"', ''), '"', 1))
  ELSE NULL END
);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-02
    • 2018-12-22
    • 1970-01-01
    • 2016-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    相关资源
    最近更新 更多