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

时间:2013-07-17 05:09:40

标签: postgresql

我想从电子邮件ID中删除元音。我应该使用哪种功能? 我想在postgresql中找到translatereplace之间的区别 但没有得到确切的差异

3 个答案:

答案 0 :(得分:12)

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

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

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

replace('abcdef', 'bc', 'FOO') --> 'aFOOdef'

答案 1 :(得分:11)

在这种情况下,您可能actually want regexp_replace

假设“元音”是指“西欧(英语)语言元音字母”,你可以写一下:

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

第四个参数中的gi表示“将这个正则表达式 g 分别应用于整个输入字符串而不仅仅是第一个匹配,并使其成为案例 i nsensitive”。

请记住,wy有时也会发音元音,具体取决于其背景。你将无法用正则表达式来处理它,所以它取决于你是否关心这个目的。

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

在大多数情况下,使用正则表达式修改单词并不是一个好方法;例如,西里尔字母表中的俄语使用A Э У О Ы Я Е Ё Ю И作为元音。另外,根据语言的不同,同一个脚本中的相同字母可能也可能不是元音! Keep reading here for more than you ever wanted to know

答案 2 :(得分:2)

TLDR;

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

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

详细信息

为了补充波西米亚人的answer

replace()translate()均可用于:

  • 替换字符
  • 消除字符

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

  • 字符串为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相同的字符串:< / p>

postgres=> select replace('foobarbaz', 'rab', '');
 replace 
---------
 foobarbaz
(1 row)
另一方面,

translate()并不处理必须在要操作的字符串上以特定顺序找到的子字符串,而是处理字符的:< / p> manipulated字符串中出现的from字符串中的每个字符都映射到{在to字符串中找到的{1}}字符串:

from

在上面的第一个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'

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

  • to

只要您关心的是translate(email_id, 'aeiou', '')元音,就如Craig Ringer的answer所述。