【问题标题】:Strange trim function behavior奇怪的修剪功能行为
【发布时间】:2013-04-30 16:40:13
【问题描述】:

我想知道为什么当我完全怀疑其他东西时我得到了空字符串...... 我使用修剪功能从字符串中剪切电话号码:

select trim(leading  '509960405' from '509960405509960404');

为什么结果不是预期的 509960404?

【问题讨论】:

  • @Robert- 没什么...
  • @RobertHarvey,ltrim 无济于事,因为它还需要一个字符列表,而不是字符串。
  • @Borys 我在SQLFiddle 中尝试了查询,它得到了 5099604,但之后错过了 05,但它确实返回了。
  • 这已经解决了,谢谢罗伯特,我现在使用替换,我正在替换('509960405509960404','509960405',''),它工作得很好。现在我正在尝试找出发生这种情况的原因?

标签: string postgresql trim postgresql-9.2


【解决方案1】:

trim 删除与字符列表匹配的所有字符。字符串中的所有字符都在“前导”字符列表中。你写的东西可以很容易地写出来

select trim(leading '04569' from '509960405509960404');

它会删除字符串开头的任何 0、4、5、6 或 9 个字符。由于您的字符串仅包含 0、4、5、6 或 9 个字符,因此会将它们全部删除。

【讨论】:

  • 那么为什么当我这样做的时候选择 trim(both '55' from '509960405509960404');结果是:09960405509960404?
  • 因为它从开头删除了 5。在这种情况下,您的字符列表中只有一个唯一字符,即“5”,并且字符串开头只有一个“5”。在抱怨它不能正常工作之前,你真的应该尝试阅读函数的文档。
  • 我红色的文档,我仍然不确定为什么它从内部削减数字,尽管它不匹配。
  • 因为正如我在答案中所说,它正在删除所有匹配的字符,并且它们都匹配。
  • 好的,我的困惑是由于字符集和整个字符串之间缺乏区别造成的,所以 thx ;)
【解决方案2】:

@Paul 澄清了trim() 的行为。
您在评论中提出的解决方案可能是奸诈

SELECT replace('509960405509960404','509960405','')

替换所有次出现的'509960405',而不仅仅是第一次。例如:

SELECT replace('509960405509960404','50996040' ,'');

结果为@​​987654328@。我怀疑这不是你想要的。
regular expressionsregexp_replace() 一起使用:

SELECT regexp_replace('509960405509960404','^509960405' ,'');

^ .. 将模式粘合到字符串的开头(“左锚定”)。
regexp_replace() 比简单的 replace() 更昂贵,但也更通用。

【讨论】:

  • 谢谢,欧文。在这种情况下,替换正是我所需要的。我的工作是在许多字符串(是的,字符串;)中查找并删除所有出现的电话号码,因为我要清理的数据是一团糟。因此,如果有人在一个字段中多次输入一个数字,我必须只返回一个数字并将其复制到其他地方。整个和正确的数字(带有适当的前缀)将成为同一字符串中另一个数字的一​​部分的概率非常低,所以我认为这是一个很好的方法。
猜你喜欢
  • 1970-01-01
  • 2014-09-18
  • 1970-01-01
  • 2012-05-27
  • 1970-01-01
  • 1970-01-01
  • 2015-11-22
  • 2023-03-03
  • 1970-01-01
相关资源
最近更新 更多