迁移 Oracle 到 PostgreSQL: DECODE 函数

五月 19, 2023

Oracle DECODE() 是一个内置函数,它根据一个或多个给定的映射关系将给定的参数解码并返回解码后的值。

Oracle DECODE() 语法

这里是 Oracle DECODE() 函数的语法:

DECODE(expr, search, result [, search, result ]...  [, default ])

参数

  • expr

    必需的。需要解码的内容。

  • search

    必需的。一个匹配项。

  • result

    必需的。search 对应的值。

  • default

    必需的。 默认值。 默认值为 NULL。

这些参数可以是任何数字类型(NUMBER、BINARY_FLOAT 或 BINARY_DOUBLE)或字符类型。

您可以提供多个 search 和 result 对儿,您可以将这些 search 和 result 对儿视为一个映射表。

返回值

Oracle DECODE() 函数将每个 search 逐个的和 expr 比较,如果 expr 和 search 相等,此函数返回对应的 result。如果没有发现匹配项,此函数返回 default (默认值为 NULL)。

如果任意一个参数为 NULL, DECODE() 将返回 NULL。

Oracle DECODE() 示例

这里有几个展示了 Oracle DECODE() 函数用法的示例。

基本用法

Oracle DECODE() 函数很适合用来翻译一些内容,比如,将状态值翻译为状态说明。

让我们创建一个包含了订单状态的数据表:

CREATE TABLE orders (
  order_id number,
  order_status number
);

INSERT INTO orders (order_id, order_status) VALUES
  (10001, 1),
  (10002, 2),
  (10003, 3),
  (10004, 4);

下面的语句将订单状态翻译为状态说明:

SELECT
    *,
    DECODE(
        order_status,
        1, 'Pending',
        2, 'Paid',
        3, 'Shipped',
        'Unknown'
    ) order_status_desc
FROM orders;

输出:

   ORDER_ID    ORDER_STATUS ORDER_STATUS_DESC
___________ _______________ ____________________
      10001               1 Pending
      10002               2 Paid
      10003               3 Shipped
      10004               4 Unknown

在本示例中,订单状态 1,2, 和 3 都被解码成各自对应的值,而 4 则被解码成默认值。如果您不提供默认值参数,DECODE() 将把 4 解码成 NULL,如下:

SELECT
    *,
    DECODE(
        order_status,
        1, 'Pending',
        2, 'Paid',
        3, 'Shipped'
    ) order_status_desc
FROM orders;

输出:

   ORDER_ID    ORDER_STATUS ORDER_STATUS_DESC
___________ _______________ ____________________
      10001               1 Pending
      10002               2 Paid
      10003               3 Shipped
      10004               4

PostgreSQL CASE 示例

我们可以使用 PostgreSQL 的 CASE 表达式,实现和 Oracle DECODE 函数类似的功能。下面的语句将订单状态翻译为状态说明:

SELECT
    *,
    CASE order_status
      WHEN 1 THEN 'Pending'
      WHEN 2 THEN 'Paid'
      WHEN 3 THEN 'Shipped'
      ELSE 'Unknown'
    END AS order_status_desc
FROM orders;

在上面示例中,订单状态 1,2, 和 3 都被解码成各自对应的值,而 4 则被解码成默认值。如果您不提供默认值参数,CASE表达式将把 4 解码成 NULL,如下:

SELECT
    *,
    CASE order_status
      WHEN 1 THEN 'Pending'
      WHEN 2 THEN 'Paid'
      WHEN 3 THEN 'Shipped'
    END AS order_status_desc
FROM orders;