SQL 如何显示数据库中 @ 后面最后一个"."之前的所有字符



(注意数据库是荷兰语的,所以不要介意奇怪的名称。(

我试图创建的查询应该显示电子邮件地址中最后一个点('.'(之前的所有字符。但我使用的查询(当然不起作用(显示了以下数据。

SELECT LEFT(mailadres, LENGTH(substring_index(mailadres, '.', 2))+1) AS edited_values, mailadres
FROM reviewers

邮件地址值:

  • Brechtje.Eefting@hotmail.
  • Martijn.Rokx@gmail.
  • Rosemijn.Stegers@gmail.
  • Ans.Vogelaar@gmail.
  • 翻转.van
  • Dirck.Boesten@gmail.
  • Kobus.van
  • 里克特.van
  • 洛伦斯.van

正如您所看到的,对于某些值,它可以完成任务,但不是我想要的。我真正想看到的值应该是这样的:

  • Brechtje.Eefting@hotmail.
  • Martijn.Rokx@gmail.
  • Rosemijn.Stegers@gmail.
  • Ans.Vogelaar@gmail.
  • Flip.van.Korsten@gmail.
  • Dirck.Boesten@gmail.
  • Kobus.van.Dijkstra@gmail.
  • Rikkert.van.Hogen@gmail.

查询应该如何获得上述结果?

如果您想要最后一个.,您应该使用带substraing_index:的负计数

left(mailadres, char_length(mailadres)-char_length(substring_index(mailadres,'.',-1))

请注意,如果不存在.,则此substring_index将返回整个字符串,从而导致两个长度相等,并且left被要求0个字符,并因此给出一个空字符串。如果你想在没有.的情况下返回整个邮件地址,你必须明确检查:

if(instr(mailadres,'.'),left(mailadres, char_length(mailadres)-char_length(substring_index(mailadres,'.',-1))),mailadres)

所以完整:

SELECT
if(instr(mailadres,'.'),left(mailadres, char_length(mailadres)-char_length(substring_index(mailadres,'.',-1))),mailadres) AS edited_values,
mailadres
FROM reviewers

您可以使用regexp_replace():

select regexp_replace(email, '^(.*[.])[^.]*$', '$1')

最新更新