Oracle 解码与 Postgres 等效的函数

Oracle decode equivalent function to Postgres

所以,我正在将数据库从 oracle 迁移到 Postgres,这是我的错误:

Caused by: org.postgresql.util.PSQLException: ERROR: function decode(unknown, unknown, integer, unknown, integer, unknown, integer, unknown, integer, unknown, integer) does not exist
  Hint: No function matches the given name and argument types. You might need to add explicit type casts.

这是我的代码:

sqlQuery.append(" order by ");
            sqlQuery.append(" decode('pts.process_status', 'PTSPS_INPROGRESS', 1, 'PTSPS_SUBMITTED', 2, ");
            sqlQuery.append("            'PTSPS_DRAFT', 3, 'PTSPS_REJECTED', 4, 'PTSPS_APPROVED', 5) ");

你有什么线索吗?

根据我的阅读,有人说用 COALESCE 替换解码函数,但我不知道语法是怎样的。

您可以使用标准 case 表达式:

order by case pts.process_status
    when 'PTSPS_INPROGRESS' then 1
    when 'PTSPS_SUBMITTED'  then 2
    when 'PTSPS_DRAFT'      then 3
    when 'PTSPS_REJECTED'   then 4
    when 'PTSPS_APPROVED'   then 5
end

Postgres 有一个使用数组的简化形式的逻辑:

order by array_position(array['PTSPS_INPROGRESS', 'PTSPS_SUBMITTED', 'PTSPS_DRAFT', 'PTSPS_REJECTED', 'PTSPS_APPROVED'],
                        pts.process_status
                       )

我应该注意到,GMB 建议的 CASE 解决方案是标准的 SQL 并且适用于 Postgres 和 Oracle(以及几乎所有其他数据库),所以这只是一个快捷方式。