Postgres - 从字符串中删除一组字母

use*_*918 10 postgresql

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

Boh*_*ian 14

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

translate('abcdef', 'ace', 'XYZ') --> 'XbYdZf'
Run Code Online (Sandbox Code Playgroud)

replace()取代了的出现与其他的任意长度的字符串:

replace('abcdef', 'bc', 'FOO') --> 'aFOOdef'
Run Code Online (Sandbox Code Playgroud)


Cra*_*ger 11

在这种情况下,你可能真的想要regexp_replace.

假设"元音"是指"西欧(英语)语言元音字母",您可以写:

SELECT regexp_replace('BobbafEtt@nerd.com', '[aeiou]', '', 'gi');
Run Code Online (Sandbox Code Playgroud)

gi第四参数写着"此正则表达式适用 lobally整个输入字符串不只是第一场比赛,并使它的情况下 nsensitive".

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

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

在大多数情况下,使用正则表达式修改单词并不是一个好方法; 例如,西里尔字母中的俄语A ? ? ? ? ? ? ? ? ?用作元音.另外,根据语言的不同,同一个脚本中的相同字母可能也可能不是元音!继续阅读这里比你想知道的更多.


Leo*_*ael 9

太长了;

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

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

详细

补充波希米亚人的答案

replace()都可translate()用于:

  • 替换字符
  • 消除字符

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

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

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

postgres=> select replace('foobarbaz', 'bar', 'FRED');
  replace   
------------
 fooFREDbaz
(1 row)
Run Code Online (Sandbox Code Playgroud)

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

postgres=> select replace('foobarbaz', 'bar', '');
 replace 
---------
 foobaz
(1 row)
Run Code Online (Sandbox Code Playgroud)

from但是,如果在字符串中无法按特定顺序找到字符串中的字符manipulatedreplace()则返回与以下字符串相同的字符串manipulated

postgres=> select replace('foobarbaz', 'rab', '');
 replace 
---------
 foobarbaz
(1 row)
Run Code Online (Sandbox Code Playgroud)

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

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

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

postgres=> select translate('foobarbaz', 'rab', '123');
 translate 
-----------
 foo32132z
(1 row)
Run Code Online (Sandbox Code Playgroud)

在上面的第一个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)
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

只要您关心的是ascii元音,正如 Craig Ringer 的回答中提到的那样。