我正在try 创建一个动态字符串,并将其附加到PostgreSQL的WHERE子句中.

ERROR:  syntax error at or near "4"
LINE 13:      when 4 = ANY(stars) then appendtext := appendtext || ' ...
                   ^ 

SQL state: 42601
Character: 332

这就是功能

CREATE OR REPLACE FUNCTION public.reviewsbystartotal(
    cid integer, stars integer[])
    RETURNS integer
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE PARALLEL UNSAFE

AS $BODY$
declare appendtext text := '';
BEGIN       
         case when 5 = ANY(stars) then appendtext := appendtext || ' and cr.generalrating >= 4.25'
              when 4 = ANY(stars) then appendtext := appendtext || ' and cr.generalrating >= 3.25 and cr.generalrating <= 4.24'
              when 3 = ANY(stars) then appendtext := appendtext || ' and cr.generalrating >= 2.5 and cr.generalrating <= 3.24'
              when 2 = ANY(stars) then appendtext := appendtext || ' and cr.generalrating >= 1.75 and cr.generalrating <= 2.49'
              when 1 = ANY(stars) then appendtext := appendtext || ' and cr.generalrating >= 1 and cr.generalrating <= 1.74'
         else

         RETURN (Select count(1) from companyreviews cr where cr.company=cid 
                 and cr.internalapproval=true
         || appendtext);
         
         

END; 
$BODY$;

我try 拼接一个字符串并将其附加到PostgreSQL中的WHERE子句中.

推荐答案

连接运算符||应放在SELECT语句的圆括号之外.

以下是您的函数的更正版本:

    CREATE OR REPLACE FUNCTION public.reviewsbystartotal(
    cid integer, stars integer[])
    RETURNS integer
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE PARALLEL UNSAFE

AS $BODY$
DECLARE
    appendtext text := '';
BEGIN       
    CASE
        WHEN 5 = ANY(stars) THEN
            appendtext := appendtext || ' and cr.generalrating >= 4.25';
        WHEN 4 = ANY(stars) THEN
            appendtext := appendtext || ' and cr.generalrating >= 3.25 and cr.generalrating <= 4.24';
        WHEN 3 = ANY(stars) THEN
            appendtext := appendtext || ' and cr.generalrating >= 2.5 and cr.generalrating <= 3.24';
        WHEN 2 = ANY(stars) THEN
            appendtext := appendtext || ' and cr.generalrating >= 1.75 and cr.generalrating <= 2.49';
        WHEN 1 = ANY(stars) THEN
            appendtext := appendtext || ' and cr.generalrating >= 1 and cr.generalrating <= 1.74';
    END CASE;

    RETURN (
        SELECT COUNT(1)
        FROM companyreviews cr
        WHERE cr.company = cid
        AND cr.internalapproval = true
    ) || appendtext;

END;
$BODY$;

Postgresql相关问答推荐

PostgreSQL:如何 for each 唯一的客户输入/更新列中的数据,并将其递增1直到表的末尾

一列引用两个不同的表

Jsonb[]字段中的PostgreSQL否定&q;-0.0

在Axum 0.5中,如何在一个请求处理程序中同时使用数据库和路径解析?

单个WAL文件中的操作会影响哪些表和多少行

使用doobie,如何将Scala case类映射到带有类型tstzmultirange的PostgreSQL列?

错误:分区表的唯一约束必须包括所有分区列

订阅标签保存在哪个表中?

PostgreSQL SELECT 结果具有不同的 id,它更喜欢来自另一个表的特定值

是否可以在 postgresql 中添加表元数据?

在 CentOS 上安装 psycopg2 时遇到问题

什么是 postgres 超级用户

Mac psql/readline - 未加载库

Rails ActiveRecord - 如何获取两个日期之间的记录

Redis 可以写出到像 PostgreSQL 这样的数据库吗?

仅在存在时重命名列

在 postgresql 中将 bool 转换为 int

防止 CHARACTER VARYING 字段中出现空字符串

有没有办法确保 WHERE 子句在 DISTINCT 之后发生?

PostgreSQL - 作为表名的动态值