mysql - 如何创建其中包含查询字符串值的 MySql VIRTUAL 列

标签 mysql json virtual-column

让我解释一下。我有一个 json 数据集,其值如下所示:

"clientRequest": {
        "uri": "/flow.php?id=FS-6097&utm_source=facebook&utm_medium=cpc&utm_term=cold",
        "body": null,
        "bytes": 608,
        "flags": 1,     
        "referer": "http://m.facebook.com/",        
        "httpMethod": "GET",
        "httpProtocol": "HTTP/1.1"
    },

现在我想创建一个虚拟列,它仅从“clientRequest.uri”获取值“FS-6097”。因此,一个新列仅包含“FS-6097”,而不仅仅是整个 uri。

我已经为整个 uri 创建了一个虚拟列,如下所示,这很好。

ALTER TABLE `table_xyz_json`
    ADD `url` TEXT
    GENERATED ALWAYS AS (JSON_UNQUOTE(
        JSON_EXTRACT(json_data, '$.clientRequest.uri')
    ))
    VIRTUAL NULL;

任何帮助将不胜感激。

最佳答案

一种选择是使用 SUBSTRING_INDEX功能:

ALTER TABLE `table_xyz_json`
  ADD `url` TEXT GENERATED ALWAYS
  AS (`json_data` ->> '$.clientRequest.uri') VIRTUAL NULL,
  ADD `id` VARCHAR(7) GENERATED ALWAYS
  AS (SUBSTRING_INDEX(
        SUBSTRING_INDEX(`url`,
        'id=', -1),
      '&', 1)
     ) VIRTUAL NULL;

参见db-fiddle .

更新

您应该根据所有适用的业务规则调整生成的列的表达式。例如,如果规则是 id 可能不存在,您可以尝试以下操作:

ALTER TABLE `table_xyz_json`
  ADD `url` TEXT GENERATED ALWAYS
  AS (`json_data` ->> '$.clientRequest.uri') VIRTUAL NULL,
  ADD `id` VARCHAR(7) GENERATED ALWAYS
  AS (IF(`url` REGEXP 'id=',
         SUBSTRING_INDEX(
           SUBSTRING_INDEX(`url`,
           'id=', -1),
         '&', 1),
         NULL
        )
     ) VIRTUAL NULL;

参见db-fiddle .

关于mysql - 如何创建其中包含查询字符串值的 MySql VIRTUAL 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46187956/

相关文章:

ruby-on-rails - rails : elegantly reduce duplication when using json to create objects

mysql - 错误代码 : 3175. 无法在基列具有外部约束的虚拟列上创建索引

MySQL SELECT 返回错误结果

php - 我如何关闭或退出Ubuntu 18.04中安装的Docker?

php - 如何使用for循环插入数据库

php - Mysql PHP插入查询无法正常工作

javascript - 标志堆栈距离不起作用

c# - 如何使用 C# 正确拆分字符串数组

mysql - 构建 docker 镜像时初始化数据库脚本的最佳方法