我想从电子邮件 ID 中删除元音。我应该使用哪个功能?我试图找出 postgresql 之间的区别,translate
但replace
没有得到确切的区别
3 回答
translate()
用另一组字符(也作为字符串传递)替换一组单个字符(作为字符串传递),例如:
translate('abcdef', 'ace', 'XYZ') --> 'XbYdZf'
replace()
用另一个字符串替换出现的任意长度的字符串:
replace('abcdef', 'bc', 'FOO') --> 'aFOOdef'
在这种情况下,您可能实际上想要regexp_replace
.
假设“元音”是指“西欧(英语)语言元音字母”,您可能会写:
SELECT regexp_replace('BobbafEtt@nerd.com', '[aeiou]', '', 'gi');
第四个参数中的thegi
表示“将此正则表达式g全局应用于整个输入字符串,而不仅仅是第一个匹配项,并使其不区分大小写”。
请记住,w
并且y
有时也是元音,这也取决于它们的上下文。您将无法使用正则表达式来处理它,因此这取决于您是否关心此目的。
如果您使用电子邮件地址,则不太可能需要处理其他字符集,因此正则表达式可能适用于此。
但是,在大多数情况下,使用正则表达式修饰单词并不是一个好方法。例如,西里尔字母表中的俄语A Э У О Ы Я Е Ё Ю И
用作元音。此外,根据语言的不同,相同脚本中的相同字母可能是元音,也可能不是元音!继续阅读这里比你想知道的更多。
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()
另一方面,不处理必须在被操作字符串的特定序列中找到的字符子字符串,而是处理字符集:
字符串中存在的字符串中的每个字符都映射到字符串中与在字符串中找到的位置相同的另一个字符:manipulated
from
to
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'
都将被消除。to
因此,要从电子邮件 ID 中消除元音,您可以执行以下操作:
translate(email_id, 'aeiou', '')
ascii
正如克雷格·林格的回答所提到的,只要你关心的是元音。