我有postgres函数,其中我在查询中附加值,以便我有,
DECLARE
clause text = '';
追加后我有一些事情,
clause = "and name='john' and age='24' and location ='New York';"
我在上面的查询的where子句中附加了我已经拥有的。在执行查询时,我得到" and
"就在" where
"之后导致错误
如何使用regex_replace
以便删除第一个"和" from子句在将其附加到查询之前?
答案 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 ', '')