我必须以下列方式清理一些varchar:
从已关闭的列表中删除特殊字符,例如:!, @, #, $, %, ^, &, *, (, ), }, {, [, ], ",", ., ?, /, ',
。我已经成功地大量使用了replace \ regexp_replace,但我正在寻找类似于SQL服务器的东西。
删除以下数字,但不包括相邻的数字:
round 1 --> round
round1 --> round1
round 12345 --> round
round12345 --> round12345
从已关闭的单词列表中删除单词,例如:“和”,“或”,“有限公司”,“国际”,不带子字符串:
more food or drinks ---> more food drinks. and not --> me food or drinks
我正在制作一张大桌子,我希望尽可能高效地工作 我应该编写一个能够做到这一点还是有更优雅方式的函数?
答案 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'
需要替换“全局”,而不仅仅是第一次出现。
->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'
));
答案 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
,因为在第一个答案中过滤掉了一个点。