postgresql - 替换文本字段中的所有字符串实例

时间:2011-02-20 22:29:08

标签: postgresql replace

在postgresql中,如何替换数据库列中字符串的所有实例?

例如,我想将cat的所有实例替换为dog

最好的方法是什么?

4 个答案:

答案 0 :(得分:356)

您想使用postgresql的replace功能:

replace(string text, from text, to text)

例如:

UPDATE <table> SET <field> = replace(<field>, 'cat', 'dog')

请注意,这将是一个字符串到字符串的替换,所以'category'将变成'dogegory'。 regexp_replace函数可以帮助您为要替换的内容定义更严格的匹配模式。

答案 1 :(得分:72)

正则表达方式

如果您需要更严格的替换匹配,PostgreSQL的/** * Checks if ID matches user passed via params */ class RecognitionRule extends Rule { public $name = 'isRecognition'; /** * @param string|integer $user the user ID. * @param Item $item the role or permission that this rule is associated with * @param array $params parameters passed to ManagerInterface::checkAccess(). * @return boolean a value indicating whether the rule permits the role or permission it is associated with. */ public function execute($user, $item, $params) { if(isset($params['recognition'])){ //Directly specify the model you plan to use via param $model = $params['recognition']; }else{ //Use the controller findModel method to get the model - this is what executes via the behaviour/rules $id = Yii::$app->request->get('id'); //Note, this is an assumption on your url structure. $model = Yii::$app->controller->findModel($id); //Note, this only works if you change findModel to be a public function within the controller. } return \common\models\Assignment::find()->where(['rec_id' => $model->id, 'user_id' => $user])->exists(); } } 函数可以使用POSIX正则表达式模式进行匹配。它的语法为 regexp_replace(source,pattern,replacement [,flags])

我将分别使用标志regexp_replacei进行不区分大小写和全局匹配。我还将分别使用g\m来匹配单词的开头和结尾。

执行正则表达式替换时通常会遇到很多问题。让我们看看用 dog 替换 cat 是多么容易。

\M

即使在所有这些之后,还有至少一个未解决的条件。例如,以“Cat”开头的句子将被小写的“dog”替换,后者会破坏句子大写。

查看当前PostgreSQL pattern matching文档的所有详细信息。

使用替换文本

更新整个列

根据我的例子,也许最安全的选择是:

SELECT regexp_replace('Cat bobcat cat cats catfish', 'cat', 'dog');
-->                    Cat bobdog cat cats catfish

SELECT regexp_replace('Cat bobcat cat cats catfish', 'cat', 'dog', 'i');
-->                    dog bobcat cat cats catfish

SELECT regexp_replace('Cat bobcat cat cats catfish', 'cat', 'dog', 'g');
-->                    Cat bobdog dog dogs dogfish

SELECT regexp_replace('Cat bobcat cat cats catfish', 'cat', 'dog', 'gi');
-->                    dog bobdog dog dogs dogfish

SELECT regexp_replace('Cat bobcat cat cats catfish', '\mcat', 'dog', 'gi');
-->                    dog bobcat dog dogs dogfish

SELECT regexp_replace('Cat bobcat cat cats catfish', 'cat\M', 'dog', 'gi');
-->                    dog bobdog dog cats catfish

SELECT regexp_replace('Cat bobcat cat cats catfish', '\mcat\M', 'dog', 'gi');
-->                    dog bobcat dog cats catfish

SELECT regexp_replace('Cat bobcat cat cats catfish', '\mcat(s?)\M', 'dog\1', 'gi');
-->                    dog bobcat dog dogs catfish

答案 2 :(得分:27)

您可以使用replace功能

UPDATE your_table SET field = REPLACE(your_field, 'cat','dog')

函数定义如下(来自here):

replace(string text, from text, to text)

并返回修改后的文本。您还可以查看this sql fiddle

答案 3 :(得分:0)

以下示例使用正则表达式替换列中包含下划线的1个或多个空格字符的所有实例 -

select distinct on (pd)
regexp_replace(rndc.pd, '\\s+', '_','g') as pd
from rndc14_ndc_mstr rndc;