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

mih*_*k3l 7 postgresql

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

例子:

1) "ggg" => ""
2) "3,0 kg" => "3,0"
3) "15 kg." => "15"
4) ...
Run Code Online (Sandbox Code Playgroud)

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

1) "2x3,25" 
2) "96+109" 
3) ...
Run Code Online (Sandbox Code Playgroud)

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

有任何想法吗?

pen*_*rik 37

使用regexp_replace更简单:

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


Sim*_*stö 7

要修改PostgreSQL中的字符串,请查看文档的字符串函数和运算符部分.函数substring(string from pattern)使用POSIX正则表达式进行模式匹配,并且可以很好地从字符串中删除不同的字符.
(请注意,VALUES括号内的子句只是提供示例材料,您可以将其替换SELECT为提供数据的任何语句或表):

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

正则表达式部分解释:

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