【问题标题】:How to use regex replace in Postgres function?如何在 Postgres 函数中使用正则表达式替换?
【发布时间】:2014-05-27 09:06:56
【问题描述】:

我有 postgres 函数,我在查询中附加值,这样我就有了,

DECLARE
    clause text = '';

添加后我有一些类似的东西,

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

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

如何使用regex_replace 以便在将其附加到查询之前从子句中删除第一个“and”?

【问题讨论】:

  • 你试过从clause的开头离开'and'吗?我不认为用正则表达式操作 sql 查询是个好主意。
  • 它将追加并在查询中,因为在某些条件下它正在追加查询并且无法停止它,这就是为什么在追加后我将其从子句中删除

标签: sql regex postgresql postgresql-9.1 plpgsql


【解决方案1】:

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

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

将使clause 等于

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

【讨论】:

    【解决方案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 并从这里开始走错路。如果这些值可以更改,不如将它们作为 valuesEXECUTEUSING 子句一起提供,并提防 SQL 注入。阅读有关此事的一些相关问答:
    https://stackoverflow.com/search?q=[plpgsql]+[dynamic-sql]+EXECUTE+USING

    【讨论】:

      【解决方案3】:

      你不需要正则表达式:

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            猜你喜欢
            • 2014-06-01
            • 1970-01-01
            • 2020-12-28
            • 1970-01-01
            • 2017-05-13
            • 2017-01-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多