删除列中的非数字字符(字符变化),postgresql(9.3.5)

删除列中的非数字字符(字符变化),postgresql(9.3.5),postgresql,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) ... 它们需要保持原样(即在数字字符之间包含非数字字符时,什么也不做)。有关在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) ...

它们需要保持原样(即在数字字符之间包含非数字字符时,什么也不做)。

有关在PostgreSQL中修改字符串的信息,请参阅文档的一节。函数
子字符串(模式中的字符串)
用于从字符串中删除不同的字符,并且效果良好。
(请注意,括号内的
VALUES
子句仅用于提供示例材料,您可以将其替换为提供数据的任何
SELECT
语句或表格):

部分解释的正则表达式:

  • [0-9]+
    -字符串至少有一个数字,例如:
    '789'
  • [0-9]+.*
    -字符串至少有一个数字后跟某物,例如:
    '12smth'
  • ([0-9]+.\*)*
    -与前一行类似的字符串零次或多次,例如:
    '12smth22smth'
  • (([0-9]+.\*)*[0-9]+)
    -前一行中的字符串零次或多次,并且在末尾至少有一个数字,例如:
    '12smth22smth345'
    • 使用更简单:

      # select regexp_replace('test1234test45abc', '[^0-9]+', '', 'g');
       regexp_replace 
      ----------------
       123445
      (1 row)
      
      ^
      表示
      ,因此不在范围
      0-9
      内的任何字符都将替换为空字符串
      '


      'g'
      是一个标志,表示所有匹配项都将被替换,而不仅仅是第一个匹配项。

      好的,regexp\u替换看起来更简单,但如何保持“2x3,25”和“96+109”等值@pensnarikbut您需要允许像34.233这样的小数点,否则值会完全改变。是否允许小数点?@AbhijitGujar只需使用“[^0-9\.]+”作为您的正则表达式查询。这将匹配任何不是0-9或“.”的字符。谢谢,这就是我要找的:)在[0-9]+.*与[0-9]+.*或([0-9]+.*与([0-9]+.*之间有什么区别?测试一些例子,但是找不到反斜杠在这里的作用有什么不同。我认为这里的反斜杠是多余的(可能是有害的)。点“.”是任意字符,星号“*”表示该字符零次或多次。所以“.*”表示任何字符零次或多次。反斜杠通常用于转义,因此。\*(点反斜杠星号)表示后跟星号的任何字符。无法在postgresql上测试,因为我当前没有安装服务器。这些反斜杠可能已经出现,因为在stackoverflow中编辑文本时,它们也需要转义。例如,在您的评论中,反斜杠已消失。
      # select regexp_replace('test1234test45abc', '[^0-9]+', '', 'g');
       regexp_replace 
      ----------------
       123445
      (1 row)