如何从 MySQL 查询的电子邮件地址中删除 'plus' 标签?

How do I remove 'plus' tags from email addresses in a MySQL query?

我有一个 table 包含电子邮件地址,其中一些包含 'plus' 标签 - 例如,

email
----------------------
user1@example.com
user2@example.org
user1+test@example.com

我需要能够查询 table 并接收不带标签的电子邮件地址:

email
----------------------
user1@example.com
user2@example.org
user1@example.com

此查询从 MySQL 的所有版本的电子邮件地址中删除标签:

SELECT IF(LOCATE('+', email) = 0, 
  email,
  CONCAT(
    SUBSTRING(email, 1, LOCATE('+', email) - 1), 
    SUBSTRING(email, LOCATE('@', email))))
FROM my_table; 

英文:如果邮箱地址中没有+,则直接使用邮箱地址即可;否则,将 + 左侧的文本与 @ 到字符串末尾的文本连接起来。

如果你是运行 MySQL 8.0,你可以使用regexp_replace()

select
    email,
    regexp_replace(email, '\+[^@].*@+', '@') new_email
from mytable

此短语为:抑制以 '+' 开始直到 '@' 的任何字符序列。如果没有匹配项,regexp_replace() 将保持字符串不变。

Demo on DB Fiddle:

with mytable as (
    select 'user1@example.org' email
    union all select 'user2@example.org'
    union all select 'user1+test@example.com'
)
select
    email,
    regexp_replace(email, '\+[^@].*@+', '@') new_email
from mytable;

| email                  | new_email         |
| ---------------------- | ----------------- |
| user1@example.org      | user1@example.org |
| user2@example.org      | user2@example.org |
| user1+test@example.com | user1@example.com |