PostgreSQL各种清理字符串\ varchar

时间:2013-01-19 08:44:13

标签: sql regex postgresql pattern-matching

我必须以下列方式清理一些varchar:

  1. 从已关闭的列表中删除特殊字符,例如:!, @, #, $, %, ^, &, *, (, ), }, {, [, ], ",", ., ?, /, ',。我已经成功地大量使用了replace \ regexp_replace,但我正在寻找类似于SQL服务器的东西。

  2. 删除以下数字,但不包括相邻的数字:

    round 1 --> round
    round1 --> round1
    round 12345 --> round
    round12345 --> round12345

  3. 从已关闭的单词列表中删除单词,例如:“和”,“或”,“有限公司”,“国际”,不带子字符串:

    more food or drinks ---> more food drinks. and not --> me food or drinks

  4. 我正在制作一张大桌子,我希望尽可能高效地工作 我应该编写一个能够做到这一点还是有更优雅方式的函数?

3 个答案:

答案 0 :(得分:4)

1。 用空格替换不在允许列表中的字符要好得多,如下所示:

select regexp_replace(
    E'aśx€ ąsd, dsa w|adwf\n  as dw dgaa[aw] asdd',
    '[^a-zA-Z0-9]',
    ' ',
    'g');

返回

a x   sd  dsa w adwf   as dw dgaa aw  asdd

Unicode中有数千个可能的字符 - 无法列出所有特殊字符。

将多个连续的空格作为练习留给读者。

答案 1 :(得分:4)

我会一起玩。这是问题2

SELECT trim(regexp_replace(
   '12 foo1 run 1457 ABC 1Foo 2456 bar 34',
   '\s*\m\d+\M\s*',
   ' ',
   'g'
   ));

返回:

foo1 run ABC 1Foo bar

我更新了使用约束表达式而不是括号表达式的答案,因为手册通知:

  

下面描述的约束转义通常是优选的;他们   不再标准,但更容易打字。

\s* ..零个或多个空格
\m ...单词的开头(与[[:<:]]相同)
\d+ .. 1位或更多位数
\M ..单词的结尾(与[[:>:]]相同)

第四个参数'g'需要替换“全局”,而不仅仅是第一次出现。

对于v9.2,

->sqlfiddle
v4.4的->sqlfiddle不起作用

为什么?

standard_conforming_strings。默认值随v9.1更改。

这个可以在两个世界中运行,“兼容模式”可以说。但上面现代版本的语法(与standard_conforming_strings = on结合使用)更清晰。

SELECT trim(regexp_replace(
  '12 foo1 run 1457 ABC 1Foo 2456 bar 34',
  E'\\s*\\m\\d+\\M\\s*',
  ' ',
  'g'
));

->sqlfiddle

答案 2 :(得分:2)

3。 我认为最快的方法是:

select regexp_replace(
  'And more food or drinks at the international airport Ltd',
  '[[:<:]](and|or|Ltd|international)[[:>:]]',
  ' ',
  'gi'
);

返回:

 more food  drinks at the  airport

我认为Ltd.确实是Ltd,因为在第一个答案中过滤掉了一个点。