我希望 ...
- ...删除空格
- ...删除撇号
- ...将 'é' 和 'è' 替换为 'e'
我使用该功能regexp_replace()
。
目前,我可以删除空格,但效果很差。事实上,当属性包含多个空格时,仅删除一个空格。
我无法同时处理1.、2.和3. 。这可能吗?
下面是我的代码的链接:
我希望 ...
我使用该功能regexp_replace()
。
目前,我可以删除空格,但效果很差。事实上,当属性包含多个空格时,仅删除一个空格。
我无法同时处理1.、2.和3. 。这可能吗?
下面是我的代码的链接:
安装附加模块
unaccent
,该模块(除其他外)提供同名功能unaccent()
。它 ...然后:
replace()
删除所有出现的模式字符串,而不仅仅是第一个。这里不需要正则表达式魔法。见下文。你的
UPDATE
可能是:小提琴
regexp_replace()
您可以通过添加“g”作为第四个参数来修改行为,例如:看:
对于简单的情况,这只是一种昂贵的说法:
我在这里可能有点困惑 - 我认为问题在哪里“删除空格” - 我相信正在讨论的是多个空格。不管怎样,我已经做了一个答案,所以就在这里——也许它会帮助人们。
解决方案 1 - 删除所有逗号、空格和重音符号。
到目前为止,一次性删除所有空格、逗号以及重音符号的最简单方法是使用该函数(请参阅此处的
TRANSLATE()
fiddle )。该解决方案有一个优点 - 有时不允许员工/顾问安装扩展,或者PostgreSQL 实例可能是基于云的并且扩展
UNACCENT
不可用 - 否则 @ErwinBrandstetter 的解决方案性能更高,即使使用双精度REPLACE()
来消除逗号:在我的家用计算机上,我创建了一个
test
包含 10M 记录的表,EB 的解决方案始终比TRANSLATE()
解决方案快约 25%,比解决方案快约 40%REGEXP_REPLACE()
- db<>fiddle 上的结果通常与此一致,但有时(也许是由于使用量激增),这可能会改变。在不受控制的系统上进行基准测试的危险。将任意空格序列减少到 1 的解决方案。
但是,要删除多个空格 - 留下一个。根据我的经验,人们永远不应该低估人们在应用程序中输入自由文本时的愚蠢/懒惰/分心/无聊 - 不小心将手机放在键盘上,然后您立即就输入了 100 个逗号!我曾经有一个地址字段,上面写着(类似 - “乔稍后会和你见面吃三明治。”)!
所以,我所做的如下(下面的所有代码都可以在此处的小提琴上找到):
用一些字符串填充它:
现在,如果您不能和/或不允许安装 PostgreSQL 扩展,您可以使用
REPLACE
(手动)功能执行以下操作:结果(对于带重音的字符串):
口音消失了——不用说,这很容易出错而且很烦人。使用
UNNACCENT
扩展会更好 - 无论如何它是 contrib 模块的一部分 - 这几乎是“核心”!然后运行以下代码:
必须运行的原因
REGEXP_REPLACE()
是因为序列中可能有多个空格(可以是 2 个、3 个或更多)(请记住上面关于自由文本输入的注释)。该BTRIM()
函数删除字符串之前或之后的任何空格字符 - 该LENGTH()
函数仅用于检查结果。正则表达式模式解释:
[ ]
- 方括号表示字符类 - 在本例中,它仅包含空格字符{2,}', ' '
是量词和替换 - 这表明REGEXP_REPLACE()
用一个空格替换 2 个或更多空格字符'g'
指定全局选项 - 在整个字符串中执行此操作在小提琴中(为简洁起见未显示),我曾经
REPLACE()
删除了补充空格,但它不能正常工作,从字符串本身(单词之间)和长度可以看出。还有另一种方法可以做到这一点(有点做作 - 但对于了解 PostgreSQL 的一些其他功能很有用):
结果-相同。
这里两个有趣的函数是
REGEXP_SPLIT_TO_TABLE()
和STRING_AGG()
。尝试拆开查询并查看它们是如何组合在一起的。从我所做的性能分析来看,第一个查询(毫不奇怪)比第二个(更长)查询更快 - 但 YMMV - 在您自己的系统和数据上进行测试。关于在只有 3 条记录且您在任何给定时刻都无法控制的系统上测试性能的常见警告适用于此。
对于撇号:
作品