如何创建其中包含查询字符串值的 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;
更新
您应该调整根据所有适用的业务规则生成的列的表达式。例如,如果规则是 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。
让我解释一下。我有一个 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;
更新
您应该调整根据所有适用的业务规则生成的列的表达式。例如,如果规则是 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。