4

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

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

  2. 删除以下数字但不删除相邻的含义:

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

  3. 从封闭的单词列表中删除单词,例如:“and”、“or”、“Ltd.”、“international”,不带子字符串:

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

我正在一张大桌子上工作,我想尽可能高效地完成它。
我应该编写一个可以做到这一点的函数还是有更优雅的方法?

4

3 回答 3

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 中有数以千计的可能字符——实际上不可能列出所有特殊字符。

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

于 2013-01-19T09:51:02.463 回答
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
->用于 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

于 2013-01-19T10:09:18.233 回答
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,因为在第一个答案中过滤掉了一个点。

于 2013-01-19T10:50:20.693 回答