我正在使用 MySQL 8 并且有一个 Regex 需要从字符串数据的表列返回一个 Regex 组。
桌子:
CREATE TABLE `table_name`(
id_column VARCHAR(300)
);
INSERT INTO `table_name` VALUES
('47099085T'),
('D73654109H'),
('8.30781719e-05'),
('0113:11:19%2000:54:17.042828927Z');
查询语句:
SELECT REGEXP_REPLACE(id_column,
'[^\\.0-9]([0-9]{8}[TRWAGMYFPDXBNJZSQVHLCKEtrwagmyfpdxbnjzsqvhlcke])', '$1') as id_output
FROM `table_name`
此处的正则表达式预期输出(regex101.com)
Regex 包含一个组,其 REGEX 替换用于返回 SELECT。
> "47099085T" // matches and returns value in quotes.
> D"73654109H" // matches and returns value in quotes.
> 8.30781719e-05 // unmatched
> 0113:11:19%2000:54:17.042828927Z // unmatched
MySQL手册指出:
REGEXP_REPLACE(expr, pat, repl[, pos[, occurrence[, match_type]]])
将字符串 expr 中与模式 pat 指定的正则表达式匹配的匹配项替换为替换字符串 repl,并返回结果字符串。如果 expr、pat 或 repl 为 NULL,则返回值为 NULL。
预期结果:
id_output |
---|
47099085T |
73654109H |
实际结果:
id_output |
---|
47099085T |
73654109H |
8.30781719e-05 |
0113:11:19%2000:54:17.042828927Z |
因此,对于与子组不匹配的两行,我期望 REGEX_REPLACE 的返回值为 NULL,因为没有任何匹配项。但它反而返回整列的数据。
为什么?
如何编辑 REGEXP 以仅返回匹配结果?
REPLACE函数几乎做同样的事情
基本上,如果原始字符串中没有可替换的内容,REPLACE和REGEXP_REPLACE都会简单地返回原始字符串。
想象一下您的查询写成更新
如果您希望REGEXP_REPLACE不返回任何内容,那将是非常具有破坏性的。鉴于此,REPLACE和REGEXP_REPLACE都将返回原始字符串是一件非常好的事情。
建议:使用 WHERE 子句
db-fiddle 查询甚至更好 WHERE 子句
MySQL 文档呢???
您对 MySQL 文档的引用指出REGEXP_REPLACE的参数为 NULL。它没有提及REGEXP_REPLACE的返回值。
更新 2023-01-20 10:50 EST
REGEXP_REPLACE在任何情况下都不应返回相同的值。我唯一能想到的是,如果你运行的是旧版本的 MySQL 8.0。该文档页面上提到了一个字符集错误:
您可能需要在 WHERE 子句中尝试使用REGEXP_LIKE并查看(我不喜欢 REGEXP 的东西)。
https://www.db-fiddle.com/f/5WAdXxGmwcdCDWH7Bbk85G/4