21

我想从电子邮件 ID 中删除元音。我应该使用哪个功能?我试图找出 postgresql 之间的区别,translatereplace没有得到确切的区别

4

3 回答 3

29

translate()用另一组字符(也作为字符串传递)替换一单个字符(作为字符串传递),例如:

translate('abcdef', 'ace', 'XYZ') --> 'XbYdZf'

replace()用另一个字符串替换出现的任意长度的字符串

replace('abcdef', 'bc', 'FOO') --> 'aFOOdef'
于 2013-07-17T05:17:25.930 回答
14

在这种情况下,您可能实际上想要regexp_replace.

假设“元音”是指“西欧(英语)语言元音字母”,您可能会写:

SELECT regexp_replace('BobbafEtt@nerd.com', '[aeiou]', '', 'gi');

第四个参数中的thegi表示“将此正则表达式g全局应用于整个输入字符串,而不仅仅是第一个匹配项,并使其不区分大小写”。

请记住,w并且y有时也是元音,这也取决于它们的上下文。您将无法使用正则表达式来处理它,因此这取决于您是否关心此目的。

如果您使用电子邮件地址,则不太可能需要处理其他字符集,因此正则表达式可能适用于此。

但是,在大多数情况下,使用正则表达式修饰单词并不是一个好方法。例如,西里尔字母表中的俄语A Э У О Ы Я Е Ё Ю И用作元音。此外,根据语言的不同,相同脚本中的相同字母可能是元音,也可能不是元音!继续阅读这里比你想知道的更多

于 2013-07-17T05:36:16.663 回答
4

TLDR;

要从“电子邮件 id”中消除所有元音,我能想到的最简单的表达式是:

  • translate(email_id, 'aeiou', '')

详细地

为了补充波西米亚人的回答

两者replace()均可translate()用于:

  • 替换字符
  • 消除字符

这两个函数都接受三个参数:

  • A string being manipulated:返回字符串将是该字符串的(可能)修改版本
  • 一个from字符串,包含要在manipulated字符串中找到的内容
  • 一个to字符串,包含输出字符串中可能存在的内容,具体取决于使用的函数、manipulated字符串和from字符串

不同之处在于replace()只能替换整个字符序列,必须以manipulated特定顺序在字符串中找到:

postgres=> select replace('foobarbaz', 'bar', 'FRED');
  replace   
------------
 fooFREDbaz
(1 row)

即使用空字符串替换它们:

postgres=> select replace('foobarbaz', 'bar', '');
 replace 
---------
 foobaz
(1 row)

但是,如果在from字符串中的特定顺序中找不到字符串中的manipulated字符,则replace()返回与该字符串相同的字符串manipulated

postgres=> select replace('foobarbaz', 'rab', '');
 replace 
---------
 foobarbaz
(1 row)

translate()另一方面,不处理必须在被操作字符串的特定序列中找到的字符子字符串,而是处理字符

字符串中存在的字符串中的每个字符都映射到字符串中与在字符串中找到的位置相同的另一个字符:manipulatedfromtofrom

postgres=> select translate('foobarbaz', 'bar', '123');
 translate 
-----------
 foo12312z

postgres=> select translate('foobarbaz', 'rab', '123');
 translate 
-----------
 foo32132z
(1 row)

在上面的第一个translate()示例中,发生了以下映射:

  • 'b'-> '1'(对于 的两次出现'b'
  • 'a'-> '2'(对于 的两次出现'a'
  • 'r'-> '3'(对于单次出现'3'

虽然translate()可以像上面那样用来映射字符,但它也可以用来消除字符集。如果to字符串比from字符串短,就会发生这种情况:

postgres=> select translate('foobarbaz', 'rab', '1');
 translate 
-----------
 foo1z
(1 row)

postgres=> select translate('foobarbaz', 'rab', '');
 translate 
-----------
 fooz
(1 row)

在上面的第一个示例中,发生了以下映射:

  • 'r'-> '1'(对于 的单次出现'r'
  • 'b'-> 消除(对于两个出现'b'
  • 'a'-> 消除(对于两个出现'a'

而在上面的第二个示例中,由于字符串为空,所有出现的字符'r','a''b'都将被消除。to

因此,要从电子邮件 ID 中消除元音,您可以执行以下操作:

  • translate(email_id, 'aeiou', '')

ascii正如克雷格·林格的回答所提到的,只要你关心的是元音。

于 2020-03-23T16:01:30.373 回答