2017-09-13 42 views
0

讓我來解釋一下。我有一個JSON數據與價值觀是這樣設置:如何創建具有查詢字符串值的MySql VIRTUAL列

"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; 

任何幫助將不勝感激。

回答

1

一種選擇是使用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

+0

非常感謝。如果我想要進行某種調整,該怎麼辦有時url包含「lp = XXXX」而不是「id = XXXX」。所以我可以確保列包含這兩個 – RashFlash

+0

嗨,我將它應用到我的數據集,並發現它不工作,因爲它應該是。例如,對於沒有「id =」的網址,例如「/apple-touch-icon-precomposed.png」,它會將虛擬col值生成爲「apple」。 – RashFlash

+0

@RashFlash:查看更新的答案。 – wchiquito