我正在尝试在存储过程中运行以下查询,但该查询不起作用。 我们尝试使用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 ;
现在,我认为它很容易修复。您还可以尝试在上面的查询中运行此查询。
答案 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}' ) || ') ... .. ...