sql - Postgres : Could not identify an ordering operator for type unknown

标签 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

如果我硬编码 name ASC 而不是 $1,像这样:

SELECT * FROM ONLY service_services
UNION ALL
SELECT * FROM fleet.service_services
WHERE deleted=false
ORDER BY name ASC
LIMIT $1

它工作正常。

我做错了什么?

最佳答案

对于一列,您可以使用 CASE WHEN 对其进行参数化:

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;

或:

SELECT * FROM ONLY service_services
UNION ALL
SELECT * FROM fleet.service_services
WHERE deleted=false
ORDER BY 
  CASE $1
       WHEN 'name' THEN name
       WHEN 'col_name' THEN col_name
       ELSE column_name -- default sorting
  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;

关于sql - Postgres : Could not identify an ordering operator for type unknown,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33802385/

相关文章:

java - 构建数据库查询的设计模式

postgresql - 将当前时间的默认值设置为 Ecto 迁移中的日期时间列

go - 在这里使用准备好的语句会更好吗?

mysql - 如何使用子查询显示来自多个表的列名

sql - 谁能推荐一个好的 SQL 解析器?

linux - 如何从一台Linux机器连接到一台Linux机器,查询PostgreSQL并获取数据

sql - 根据百分比查询投票表顶部项目

java - 将不带参数的查询传递给 PreparedStatement 是否安全?

php - MySQL在PHP中插入错误

php - 当 mysql 数据库中某些月份有空数据时,如何在使用 MONTHNAME 时包含所有月份?