Estou usando o MySQL 8 e tenho um Regex que precisa retornar um grupo Regex de uma coluna de tabela de dados de string.
Mesa:
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');
SQL:
SELECT REGEXP_REPLACE(id_column,
'[^\\.0-9]([0-9]{8}[TRWAGMYFPDXBNJZSQVHLCKEtrwagmyfpdxbnjzsqvhlcke])', '$1') as id_output
FROM `table_name`
Regex esperava saída aqui (regex101.com)
O Regex contém um grupo, cujo REGEX replace é usado para retornar ao 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
O manual do MySQL afirma:
REGEXP_REPLACE(expr, pat, repl[, pos[, occurrence[, match_type]]])
Substitui as ocorrências na string expr que correspondem à expressão regular especificada pelo padrão pat pela string de substituição repl e retorna a string resultante. Se expr, pat ou repl for NULL, o valor de retorno será NULL .
Resultado esperado:
id_output |
---|
47099085T |
73654109H |
Resultado real:
id_output |
---|
47099085T |
73654109H |
8.30781719e-05 |
0113:11:19%2000:54:17.042828927Z |
Portanto, para as duas linhas que não correspondem ao subgrupo, espero que o retorno no REGEX_REPLACE seja NULL, porque não há nenhuma correspondência. Mas, em vez disso, retorna os dados da coluna inteira.
Por que?
Como posso editar o REGEXP para retornar apenas os resultados correspondentes?
A função REPLACE faz praticamente a mesma coisa
Basicamente, REPLACE e REGEXP_REPLACE simplesmente retornariam a string original se não houvesse nada para substituir na string original.
Imagine sua consulta escrita como um UPDATE
Isso seria bastante destrutivo se você deseja que REGEXP_REPLACE não retorne nada. À luz disso, é muito bom que REPLACE e REGEXP_REPLACE retornem a string original.
SUGESTÃO: Use uma cláusula WHERE
A consulta db-fiddle é ainda melhor cláusula WHERE
E a documentação do MySQL???
Sua citação da documentação do MySQL indica que os parâmetros de REGEXP_REPLACE são NULL. Ele não menciona o valor de retorno de REGEXP_REPLACE .
ATUALIZAÇÃO 2023-01-20 10:50 EST
REGEXP_REPLACE não deve retornar o mesmo valor em nenhuma instância. A única coisa em que consigo pensar é se você estiver executando uma versão mais antiga do MySQL 8.0. Há um bug de conjunto de caracteres mencionado nessa página de documentação:
Você pode precisar experimentar REGEXP_LIKE na cláusula WHERE e ver (não sou fã de coisas REGEXP).
https://www.db-fiddle.com/f/5WAdXxGmwcdCDWH7Bbk85G/4