Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Postgres:无法识别未知类型的排序运算符_Sql_Postgresql_Prepared Statement - Fatal编程技术网

Sql Postgres:无法识别未知类型的排序运算符

Sql Postgres:无法识别未知类型的排序运算符,sql,postgresql,prepared-statement,Sql,Postgresql,Prepared Statement,我对准备好的声明提出了这个问题: SELECT * FROM ONLY service_services UNION ALL SELECT * FROM fleet.service_services WHERE deleted=false ORDER BY $1 LIMIT $2 我将name ASC的值发送到$1和10到$2 出于某种原因,我会出现以下错误: could not identify an ordering operator for type unknown 如果我硬编码名称A

我对准备好的声明提出了这个问题:

SELECT * FROM ONLY service_services
UNION ALL
SELECT * FROM fleet.service_services
WHERE deleted=false
ORDER BY $1
LIMIT $2
我将
name ASC
的值发送到
$1
10
$2

出于某种原因,我会出现以下错误:

could not identify an ordering operator for type unknown
如果我硬编码
名称ASC
而不是$1,如下所示:

SELECT * FROM ONLY service_services
UNION ALL
SELECT * FROM fleet.service_services
WHERE deleted=false
ORDER BY name ASC
LIMIT $1
它工作得很好


我做错了什么?

您不能将列名作为变量传递(除非您使用的是动态查询构建)

对于一列,您可以在参数化时使用
大小写:

SELECT * FROM ONLY service_services
UNION ALL
SELECT * FROM fleet.service_services
WHERE deleted=false
ORDER BY 
  CASE WHEN $1 = 'name' THEN name
       WHEN $1 = 'col_name' THEN col_name
       ELSE ...
  END
LIMIT $2;
或:

使用
CASE
您可能需要将列强制转换为相同的数据类型,以避免隐式转换错误

编辑:

SELECT sub.*
FROM (
    SELECT * FROM ONLY service_services
    UNION ALL
    SELECT * FROM fleet.service_services
    WHERE deleted=false
) As sub
ORDER BY 
    CASE $1
           WHEN 'name' THEN name
           WHEN 'col_name' THEN col_name
           ELSE column_name -- default sorting
    END
LIMIT $2;

谢谢,但是它说,
无效的UNION/INTERSECT/EXCEPT ORDER BY子句(@JahongirRahmonov)只尝试一个查询,而不使用UNION@JahongirRahmonov尝试使用子查询
SELECT sub.*
FROM (
    SELECT * FROM ONLY service_services
    UNION ALL
    SELECT * FROM fleet.service_services
    WHERE deleted=false
) As sub
ORDER BY 
    CASE $1
           WHEN 'name' THEN name
           WHEN 'col_name' THEN col_name
           ELSE column_name -- default sorting
    END
LIMIT $2;