在postgresql中,如何替换数据库列中字符串的所有实例?
例如,我想将cat
的所有实例替换为dog
。
最好的方法是什么?
答案 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_replace
和i
进行不区分大小写和全局匹配。我还将分别使用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;