如何在Postgres函数中使用正则表达式替换?

时间:2014-05-27 09:06:57

标签: sql regex postgresql postgresql-9.1 plpgsql

我有postgres函数,其中我在查询中附加值,以便我有,

DECLARE
    clause text = '';

追加后我有一些事情,

clause = "and name='john' and age='24' and location ='New York';"

我在上面的查询的where子句中附加了我已经拥有的。在执行查询时,我得到" and"就在" where"之后导致错误

如何使用regex_replace以便删除第一个"和" from子句在将其附加到查询之前?

5 个答案:

答案 0 :(得分:2)

不是在事后修复clause,而是可以通过使用来避免问题 concat_ws(与分隔符连接):

clause = concat_ws(' and ', "name='john'", "age='24'", "location ='New York'") 

会使clause等于

"name='john' and age='24' and location ='New York'"

答案 1 :(得分:2)

这可以更简单。将right()负偏移量一起使用。

截断前n个字符,您不需要指定字符串的长度。更快,更简单。

双引号(")用于Postgres(和标准SQL)中的标识符,在您的示例中不正确。将字符串文字括在单引号(')中并转义单引号 - 或使用美元引用:
Insert text with single quotes in PostgreSQL

由于这是一个plpgsql赋值,请使用the proper assignment operator :=。 SQL赋值运算符=也是可以容忍的,但在极端情况下会导致歧义。

最后,您可以在声明时在plpgsql 中指定一个变量。 plpgsql中的赋值仍然比其他编程语言便宜但价格昂贵。

DECLARE
   clause text := right($$and name='john' and age='24' ... $$, -5)

所有这一切,它似乎就像你正在尝试使用动态SQL 并在这里错误地开始。如果这些值可以更改,而是使用USING的{​​{1}}子句将它们作为提供,并警惕SQL注入。阅读有关此事的一些相关问题和答案:
https://stackoverflow.com/search?q=[plpgsql]+[dynamic-sql]+EXECUTE+USING

答案 2 :(得分:1)

您不需要正则表达式:

clause = substr(clause, 5, 10000);
clause = substr(clause, 5, length(clause)- 4); -- version for formalists

答案 3 :(得分:1)

concat_ws听起来是最好的选择,但作为这类事物(或任何带分隔符的列表)的通用解决方案,您可以使用像(伪代码)这样​​的逻辑:

delim = '';
while (more appendages)
    clause = delim + nextAppendage;
    delim = ' AND ';

答案 4 :(得分:0)

如果你想用正则表达式做,请试试这个:

result = regexp_replace(clause, '^and ', '')