2013-04-30 73 views
0

我不知道为什么我得空字符串作为结果,当我especting东西完全别的...... 我用微调功能,从切串电话号码:奇怪的微调功能行为

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

为什么预期结果不是509960404?

+0

结果是什么? – 2013-04-30 16:41:32

+0

尝试使用'ltrim'。 http://www.postgresql.org/docs/8.1/static/functions-string.html – 2013-04-30 16:43:17

+0

@罗伯特 - 这没什么... – Borys 2013-04-30 16:43:54

回答

2

trim去掉任何匹配字符列表的字符。字符串中的所有字符都在您的“领先”字符列表中。你所写的也很容易被写成

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

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

+0

所以为什么当我这样做时选择修剪('50''509960405509960404');其结果是:09960405509960404? – Borys 2013-04-30 16:45:23

+1

因为它从头开始删除了5。在这种情况下,你的角色列表中只有一个唯一的字符,'5',并且在字符串的开头只有一个'5'。您应该尝试阅读功能的文档,然后抱怨它没有正常工作。 – 2013-04-30 16:47:03

+0

我红色的文档,我仍然不知道为什么它从内部削减数字,虽然它不匹配。 – Borys 2013-04-30 16:50:04

2

@Paul澄清了trim()的行为。
解决方案您的评论呈现潜在奸诈


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

替换所有出现'509960405'不只是第一个。例如:


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

结果在54。我怀疑这是而不是你想要什么。
从字符串开头删除模式的常用方法是使用regular expressions。您可以在Postgres中使用regexp_replace()

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

^ ..胶图案到所述串的开始(“左锚定”)。
regexp_replace()没有简单的replace()快,但提供了丰富的选项。
还有其他方法,这取决于您的确切(秘密)要求。

+0

thx,Erwin。替换正是我在这种情况下需要的。我的工作是在许多字符串(是,字符串;)中查找和剪切所有出现的电话号码,因为我即将清理的数据是一个大混乱。因此,如果有人在一个字段中多次输入一个数字,我只能返回一个数字并将其复制到其他地方。整个和正确的数字(有适当的前缀)gonnna是同一个字符串中另一个数字的一​​部分的概率非常低,所以我认为这是做这件事的好方法。 – Borys 2013-05-02 18:21:18