PostgreSQL 在一行中只选择字母字符

7
我需要从一行中仅选择 alpha 字符,但是我对表达式不太熟悉。我尝试过: SELECT 只有 alpha 字符 FROM 但是出现了问题。
SELECT id, regexp_replace(_column_name_, '0123456789', '') AS _column_alias_
FROM _table_name_;

我知道一般情况下只会替换数字,但是该列一开始就包含字母和数字。

如果_column_name_包含值a1b2c3,我该如何让PostgreSQL返回字符串abc

3个回答

8

使用简单的translate()表达式是消除字符串中所有数字最快的方法:

SELECT translate(col,'0123456789','') AS col_without_digits
FROM   tbl;

正则表达式功能强大且多才多艺,但更加昂贵。

你的错误在于缺少第四个参数——“global”开关,正如Ben所指出的那样。在使用正则表达式时,您还可以使用类别简写符号\d

SELECT regexp_replace(col, '\d', '', 'g') AS col_without_digits
FROM   tbl;

啊,现在我需要对这两个答案进行基准测试。查看 http://dba.stackexchange.com/questions/42012/how-can-i-benchmark-a-postgresql-query。另一个答案当然是有效的,所以正在处理它。 :-) - John
6.076毫秒对比1.773毫秒,绝对更快,我想知道当我把笔记本电脑换成固态硬盘时会更快多少。我会点赞Ben并接受你的答案。 - John
@John:我在过去几年中运行了许多基准测试。结果如预期。 - Erwin Brandstetter
虽然我从未在PostgreSQL中进行过基准测试,但我并不怀疑你的能力。现在,我已经为我的MySQL/PostgreSQL交叉引用得到了两个更新。 :-) - John

4
语法是 regexp_replace(string text, pattern text, replacement text [, flags text]),使用 'g' 作为标志使替换全局:
SELECT id, regexp_replace(_column_name_,'[0-9]','','g') AS _column_alias_
FROM _table_name_;

谢谢!虽然 Erwin 的 translate() 更快,但它确实有效,至少已经得到了点赞。 - John

3

如果您想同时删除标点符号和非字母内容:

SELECT id, regexp_replace(_column_name_, '[^a-zA-Z]', '', 'g') AS _column_alias_
FROM _table_name_;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接