我必须用以下方式清理一些varchar:
从关闭列表中删除特殊字符,如:!, @, #, $, %, ^, &, *, (, ), }, {, [, ], ",", ., ?, /, ',。我在大量使用replace\regexp_replace时做到了这一点,但我正在寻找与SQL server中类似的东西。
删除以下数字,但不删除相邻数字的含义:
round 1 --> round
round1 --> round1
round 12345 --> round
round12345 --> round12345
从封闭的单词列表中删除单词,例如:“and”,“or”,“Ltd.”,“international”,不带子字符串:
more food or drinks ---> more food drinks. and not --> me food or drinks
我在一张大桌子上工作,我想尽可能地提高效率。
我应该写一个这样的函数,还是有一个更优雅的方法?

最佳答案

我一起玩。下面是问题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+。。一个或多个数字
\M。。词尾(与[[:>:]]相同)
需要第四个参数'g'来替换“全局”,而不仅仅是第一个出现的参数。
->sqlfiddle对于v9.2
->sqlfiddle对于v8.4不起作用
为什么?
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

07-27 13:43