删除列中的非数字字符(charachter vary),postgresql(9.3.5)

时间:2015-02-19 12:27:53

标签: postgresql

我需要删除列中的非数字字符(字符变化)并在postgresql 9.3.5中保留数值。

示例:

1) "ggg" => ""
2) "3,0 kg" => "3,0"
3) "15 kg." => "15"
4) ...

有一些问题,有些值如下:

1) "2x3,25" 
2) "96+109" 
3) ...

这些需要保持原样(即在数字字符之间包含非数字字符时 - 什么都不做)。

有什么想法吗?

2 个答案:

答案 0 :(得分:31)

使用regexp_replace更简单:

# select regexp_replace('test1234test45abc', '[^0-9]+', '', 'g');
 regexp_replace 
----------------
 123445
(1 row)

答案 1 :(得分:6)

要修改PostgreSQL中的字符串,请查看文档的The String functions and operators部分。函数substring(string from pattern)使用POSIX regular expressions for pattern matching,可以很好地从字符串中删除不同的字符 (请注意,括号内的VALUES子句只是提供示例材料,您可以将其替换为提供数据的任何SELECT语句或表格:

SELECT substring(column1 from '(([0-9]+.*)*[0-9]+)'), column1 FROM
    (VALUES
        ('ggg'),
        ('3,0 kg'),
        ('15 kg.'),
        ('2x3,25'),
        ('96+109')
    ) strings

正则表达式在部分中解释:

  • [0-9]+ - 字符串至少包含一个数字,例如:'789'
  • [0-9]+.* - 字符串后面至少有一个数字,例如:'12smth'
  • ([0-9]+.\*)* - 类似于前一行的字符串零次或多次,例如:'12smth22smth'
  • (([0-9]+.\*)*[0-9]+) - 前一行的字符串为零次或多次,最后至少包含一个数字,例如:'12smth22smth345'