Skip to content

PostgreSQL - 数值函数

PostgreSQL 提供了一个丰富的数学和数值函数库,这对于数据分析、计算和操作至关重要。本教程将这些函数组织成逻辑组,并通过实际的现代示例演示它们的用法。

让我们使用一个示例 products 表进行演示:

CREATE TABLE products (
id SERIAL PRIMARY KEY,
name TEXT,
price NUMERIC(10, 2),
stock_change INT,
rating NUMERIC(3, 2)
);
INSERT INTO products (name, price, stock_change, rating) VALUES
('Laptop', 1200.55, -10, 4.58),
('Mouse', 25.00, 50, 4.20),
('Keyboard', 75.99, 25, 4.66),
('Webcam', 49.49, -5, 3.81);

这些函数用于调整数值的精度。

  • ROUND(n, d):将数字 n 舍入到 d 位小数。如果省略 d,则舍入到最近的整数。
  • CEIL(n) 或 CEILING(n):将数字 n 向上舍入到最近的整数。
  • FLOOR(n):将数字 n 向下舍入到最近的整数。
SELECT
name,
price,
ROUND(price) AS rounded_to_integer,
ROUND(price, 1) AS rounded_to_one_decimal,
CEIL(price) AS ceiling_price,
FLOOR(price) AS floor_price
FROM products WHERE name = 'Laptop';

结果:

name | price | rounded_to_integer | rounded_to_one_decimal | ceiling_price | floor_price
--------+---------+--------------------+------------------------+---------------+-------------
Laptop | 1200.55 | 1201 | 1200.6 | 1201 | 1200
  • ABS(n):返回 n 的绝对值(非负值)。
  • MOD(a, b):返回 a 除以 b 的余数(取模运算符)。
  • SQRT(n):返回 n 的平方根。
  • POW(base, exp) 或 POWER(base, exp):返回 base 的 exp 次幂。
-- 获取库存变化的幅度
SELECT name, stock_change, ABS(stock_change) AS absolute_change FROM products;
-- POWER 示例
SELECT POWER(2, 8); -- 结果: 256
-- SQRT 示例
SELECT SQRT(64); -- 结果: 8

这些函数对于从参数列表中查找极端值非常有用。

  • GREATEST(val1, val2, ...):返回输入列表中的最大值。
  • LEAST(val1, val2, ...):返回输入列表中的最小值。
-- 设想一个有基础价格和销售价格的场景。
SELECT
name,
price AS original_price,
LEAST(price * 0.8, 1000.00) AS sale_price -- 销售折扣为 8 折,售价上限为 $1000
FROM products WHERE name = 'Laptop';

结果:

name | original_price | sale_price
--------+----------------+------------
Laptop | 1200.55 | 960.44

PostgreSQL 提供了一整套用于专业科学和工程计算的函数。请注意,三角函数以弧度为单位进行操作。

  • SIN(x)、COS(x)、TAN(x)
  • ASIN(x)、ACOS(x)、ATAN(x)、ATAN2(y, x)
  • COT(x)
  • RADIANS(degrees):将度数转换为弧度。
  • DEGREES(radians):将弧度转换为度数。
-- 计算 90 度的正弦值
SELECT SIN(RADIANS(90)); -- 结果: 1
  • LOG(n):自然对数(以 e 为底)。
  • LOG(b, n):以 b 为底 n 的对数。
  • EXP(n):指数函数(e 的 n 次幂)。
SELECT LOG(10, 100); -- 结果: 2
  • PI():返回圆周率 Pi (π) 的常数值。
  • SIGN(n):如果 n 为负数,返回 -1;如果 n 为零,返回 0;如果 n 为正数,返回 1。
SELECT name, stock_change, SIGN(stock_change) AS direction FROM products;
-- 结果:
-- name | stock_change | direction
-- -----------+--------------+-----------
-- Laptop | -10 | -1
-- Mouse | 50 | 1
-- Keyboard | 25 | 1
-- Webcam | -5 | -1