一尘不染

PostgreSQL清理字符串\ varchar

sql

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

  1. !, @, #, $, %, ^, &, *, (, ), }, {, [, ], ",", ., ?, /, ',从封闭列表中删除特殊字符,例如:。我已经通过大量使用replace \ regexp_replace做到了这一点,但是我正在寻找与SQL Server类似的东西。

  2. 删除以下数字,但不要删除相邻的数字,这意味着:

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

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

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

我正在一张大桌子上工作,我想使其尽可能高效。
我应该编写一个执行该操作的函数还是有一种更优雅的方法?


阅读 156

收藏
2021-05-23

共1个答案

一尘不染

我会一起玩的。这是 问题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'需要第4个参数来替换“全局”,而不仅仅是第一次出现。

-> v9.2的sqlfiddle-

> v8.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

2021-05-23