在存储过程中形成正则表达式字符串时出现问题

时间:2019-03-14 14:50:54

标签: postgresql

我正在尝试在存储过程中运行以下查询,但该查询不起作用。 我们尝试使用NOTICE打印查询,并且看到E被附加到了正则表达式上,这就是查询不显示任何输出的原因。

不起作用

select order,version from mytable
where substring(version  from quote_literal('[0-9]+\.[0-9]{1}'))
IN ('6.2') and order= 'ABC';

但是如果我从pgadmin查询工具运行,则使用相同的查询,效果很好。

工作

select order,version  from mytable
where substring(version from '[0-9]+\.[0-9]{1}')
IN ('6.2') and order= 'ABC';

我的要求是在存储过程中动态形成reqex。请指导如何实现此目标。

下面是我的存储过程中的代码行

sql_query = sql_query || ' AND substring(version from ' || quote_literal( '[0-9]+\.[0-9]{1}' ) || ') IN (' || quote_literal(compatibleVersions) || ')';
raise notice 'Value: %', sql_query;                                        
EXECUTE sql_query  INTO query_result ;

从通知中我得到以下输出,

AND substring(version from E'[0-9]+\\.[0-9]{1}') IN ('{6.2}')

我的要求是使此正则表达式正常工作。

我缩小了查询范围,

工作

select substring(version from '[0-9]+\.[0-9]{1}') from mytable ;

不起作用

select substring(version from quote_literal('[0-9]+\.[0-9]{1}')) from mytable ;

现在,我认为它很容易修复。您还可以尝试在上面的查询中运行此查询。

2 个答案:

答案 0 :(得分:1)

由于您的问题实际上不是使用E的扩展字符串文字语法,而是IN列表中数组的字符串表示形式,因此您的PL / pgSQL应该看起来像这样:

sql_query = sql_query ||
            ' AND substring(version from ' || quote_literal( '[0-9]+\.[0-9]{1}' ) ||
                ') IN (' || (SELECT string_agg(quote_literal(x), ', ')
                             FROM unnest(compatibleVersions
                            ) AS x(x)) || ')';

答案 1 :(得分:0)

在您要动态构造查询的情况下,应使用

quote_literal。在这种情况下,在最终构造的查询中,quote_literal将被E替换。

正确的使用方式

select * from config_support_module where substring(firmware from '[0-9]+\.[0-9]{1}') IN ('6.2');


select * from config_support_module where substring(firmware from E'[0-9]+\.[0-9]{1}') IN ('6.2') ;

在静态查询中错误使用quote_literal

select * from config_support_module where substring(firmware from quote_literal('[0-9]+\.[0-9]{1}')) IN ('6.2') ;
 This doesnt give you any errors/output.

动态查询中的quote_literal用法

sql_query = sql_query || ' AND substring(version from ' || quote_literal( '[0-9]+\.[0-9]{1}' ) || ') ... .. ...