簡體   English   中英

如何創建具有查詢字符串值的MySql VIRTUAL列

[英]How to create MySql VIRTUAL Column that have query string value in it

讓我解釋 。 我有一個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

UPDATE

您應該根據所有適用的業務規則調整生成的列的表達式。 例如,如果規則是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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM