我必须用以下方式清理一些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