目录
PostgreSQL 提供了极其丰富的内置函数,用于操作和处理数据。以下是一些最常用的函数分类和示例:
一、字符串函数
-
CONCAT(str1, str2, ...)/str1 || str2 || ...- 功能: 连接字符串。
- 示例:
SELECT CONCAT('Hello', ' ', 'World');或SELECT 'Hello' || ' ' || 'World';->'Hello World'
-
LENGTH(str)/CHAR_LENGTH(str)- 功能: 返回字符串的字符数。
- 示例:
SELECT LENGTH('PostgreSQL');->10
-
UPPER(str)- 功能: 将字符串转换为大写。
- 示例:
SELECT UPPER('hello');->'HELLO'
-
LOWER(str)- 功能: 将字符串转换为小写。
- 示例:
SELECT LOWER('SQL');->'sql'
-
TRIM([LEADING | TRAILING | BOTH] [characters] FROM str)- 功能: 从字符串开头(
LEADING)、结尾(TRAILING)或两端(BOTH,默认)移除指定的字符(默认为空格)。 - 示例:
SELECT TRIM(' space ');->'space'SELECT TRIM(LEADING '0' FROM '000123');->'123'SELECT TRIM(BOTH 'x' FROM 'xxSQLxx');->'SQL'
- 功能: 从字符串开头(
-
SUBSTRING(str FROM start [FOR length])/SUBSTR(str, start [, length])- 功能: 从字符串中提取子串。
start是起始位置(从1开始),length是要提取的长度(可选)。 - 示例:
SELECT SUBSTRING('PostgreSQL' FROM 6 FOR 3);->'gre'SELECT SUBSTR('Database', 3, 4);->'taba'(注意:SUBSTR的start位置行为在某些版本/设置下可能不同,推荐用SUBSTRING)
- 功能: 从字符串中提取子串。
-
REPLACE(str, from_str, to_str)- 功能: 将字符串中出现的所有
from_str替换为to_str。 - 示例:
SELECT REPLACE('foo bar baz', 'bar', 'qux');->'foo qux baz'
- 功能: 将字符串中出现的所有
-
SPLIT_PART(str, delimiter, field_num)- 功能: 根据分隔符拆分字符串,并返回指定字段编号的部分(从1开始)。
- 示例:
SELECT SPLIT_PART('john.doe@example.com', '.', 2);->'doe@example'(取第二个点之前的部分)
-
POSITION(substring IN str)- 功能: 返回子串在字符串中第一次出现的位置(从1开始),找不到则返回0。
- 示例:
SELECT POSITION('SQL' IN 'PostgreSQL');->8
-
LEFT(str, n)/RIGHT(str, n)- 功能: 返回字符串左边/右边的
n个字符。 - 示例:
SELECT LEFT('PostgreSQL', 4);->'Post',SELECT RIGHT('PostgreSQL', 3);->'SQL'
- 功能: 返回字符串左边/右边的
二、数学函数
-
ROUND(value [, precision])- 功能: 将数值四舍五入到指定的小数位数(
precision,默认为0)。 - 示例:
SELECT ROUND(123.4567, 2);->123.46,SELECT ROUND(123.4567);->123
- 功能: 将数值四舍五入到指定的小数位数(
-
CEIL(value)/CEILING(value)- 功能: 返回大于或等于参数的最小整数(向上取整)。
- 示例:
SELECT CEIL(123.45);->124,SELECT CEIL(-123.45);->-123
-
FLOOR(value)- 功能: 返回小于或等于参数的最大整数(向下取整)。
- 示例:
SELECT FLOOR(123.45);->123,SELECT FLOOR(-123.45);->-124
-
ABS(value)- 功能: 返回数值的绝对值。
- 示例:
SELECT ABS(-15);->15
-
POWER(base, exponent)- 功能: 返回
base的exponent次幂。 - 示例:
SELECT POWER(2, 3);->8
- 功能: 返回
-
SQRT(value)- 功能: 返回数值的平方根。
- 示例:
SELECT SQRT(9);->3
-
MOD(dividend, divisor)- 功能: 返回
dividend除以divisor的余数(模运算)。 - 示例:
SELECT MOD(10, 3);->1
- 功能: 返回
-
RANDOM()- 功能: 返回一个范围在
[0.0, 1.0)的随机浮点数。 - 示例:
SELECT RANDOM();->0.123456789...(每次不同)
- 功能: 返回一个范围在
-
PI()- 功能: 返回圆周率 π 的值。
- 示例:
SELECT PI();->3.141592653589793
-
三角函数 (
SIN,COS,TAN,ASIN,ACOS,ATAN,ATAN2)- 功能: 执行标准的三角函数计算(参数通常为弧度)。
- 示例:
SELECT SIN(PI()/2);->1.0
三、日期和时间函数
-
CURRENT_DATE- 功能: 返回当前日期(不含时间)。
- 示例:
SELECT CURRENT_DATE;->2023-10-27(取决于执行日期)
-
CURRENT_TIME/CURRENT_TIME(precision)- 功能: 返回当前时间(不含日期),可指定精度。
- 示例:
SELECT CURRENT_TIME;->14:30:15.123456+08(取决于执行时间和时区)
-
CURRENT_TIMESTAMP/CURRENT_TIMESTAMP(precision)/NOW()- 功能: 返回当前日期和时间(带时区),可指定精度。
NOW()是CURRENT_TIMESTAMP的同义词。 - 示例:
SELECT CURRENT_TIMESTAMP;->2023-10-27 14:30:15.123456+08
- 功能: 返回当前日期和时间(带时区),可指定精度。
-
EXTRACT(field FROM source)- 功能: 从日期/时间/时间间隔值中提取指定的部分(年、月、日、小时、分钟、秒等)。
- 示例:
SELECT EXTRACT(YEAR FROM CURRENT_DATE);->2023SELECT EXTRACT(MONTH FROM TIMESTAMP '2023-10-27 15:00:00');->10SELECT EXTRACT(DAY FROM CURRENT_DATE);->27SELECT EXTRACT(HOUR FROM CURRENT_TIME);->14(取决于当前时间)
-
DATE_PART('field', source)- 功能: 功能与
EXTRACT完全相同,是 PostgreSQL 的历史函数形式。推荐使用标准的EXTRACT。 - 示例:
SELECT DATE_PART('dow', CURRENT_DATE);->5(返回星期几,0=周日, 1=周一, ..., 6=周六)
- 功能: 功能与
-
AGE([timestamp1, ] timestamp2)- 功能: 当只有一个参数时,计算该时间戳到当前日期的间隔。当有两个参数时,计算
timestamp1到timestamp2的间隔。 - 示例:
SELECT AGE(TIMESTAMP '1990-01-01');->33 years 9 mons 26 days(假设当前是2023-10-27)SELECT AGE(TIMESTAMP '2023-01-15', TIMESTAMP '2023-10-27');->9 mons 12 days
- 功能: 当只有一个参数时,计算该时间戳到当前日期的间隔。当有两个参数时,计算
-
DATE_TRUNC('precision', source)- 功能: 将日期/时间值截断到指定的精度(年、季度、月、周、日、小时等),返回该精度的开始时刻。
- 示例:
SELECT DATE_TRUNC('month', TIMESTAMP '2023-10-27 14:30:15');->2023-10-01 00:00:00SELECT DATE_TRUNC('hour', CURRENT_TIMESTAMP);->2023-10-27 14:00:00+08(取决于当前时间)
-
TO_CHAR(timestamp, format)- 功能: 将时间戳格式化为指定模式的字符串。
- 示例:
SELECT TO_CHAR(CURRENT_TIMESTAMP, 'YYYY-MM-DD HH24:MI:SS');->'2023-10-27 14:30:15'(取决于当前时间) - 常用格式模板:
YYYY(4位年),MM(月),DD(日),HH24(24小时制小时),MI(分),SS(秒),DY(星期缩写),Day(星期全称),Mon(月份缩写),Month(月份全称)。
-
INTERVAL 'string'- 功能: 构造一个时间间隔值。
- 示例:
SELECT CURRENT_TIMESTAMP + INTERVAL '1 day 2 hours';(一天两小时之后)SELECT CURRENT_DATE - INTERVAL '1 week';(一周之前)
四、条件表达式函数
-
COALESCE(value1, value2, ..., valuen)- 功能: 返回参数列表中第一个非
NULL的值。常用于处理可能为NULL的字段并提供默认值。 - 示例:
SELECT COALESCE(description, 'No description provided') FROM products;(如果description是NULL,则返回'No description provided')
- 功能: 返回参数列表中第一个非
-
NULLIF(value1, value2)- 功能: 如果
value1等于value2,则返回NULL;否则返回value1。常用于避免除零错误或特定比较。 - 示例:
SELECT NULLIF(0, 0);->NULLSELECT 100 / NULLIF(column_value, 0);(避免除零错误)
- 功能: 如果
-
GREATEST(value1, value2, ...)- 功能: 返回参数列表中的最大值。
- 示例:
SELECT GREATEST(10, 5, 20, 15);->20
-
LEAST(value1, value2, ...)- 功能: 返回参数列表中的最小值。
- 示例:
SELECT LEAST(10, 5, 20, 15);->5
-
CASE ... WHEN ... THEN ... [ELSE ...] END- 功能: 强大的条件分支表达式。有两种形式:
- 简单
CASE:CASE expression WHEN value1 THEN result1 WHEN value2 THEN result2 ... [ELSE else_result] END - 搜索
CASE:CASE WHEN condition1 THEN result1 WHEN condition2 THEN result2 ... [ELSE else_result] END
- 简单
- 示例:
SELECT CASE status WHEN 1 THEN 'Active' WHEN 0 THEN 'Inactive' ELSE 'Unknown' END FROM users;SELECT CASE WHEN score >= 90 THEN 'A' WHEN score >= 80 THEN 'B' WHEN score >= 70 THEN 'C' ELSE 'F' END FROM grades;
- 功能: 强大的条件分支表达式。有两种形式:
五、类型转换函数
-
CAST(value AS type)- 功能: 标准的类型转换运算符。
- 示例:
SELECT CAST('123' AS INTEGER);->123SELECT CAST(CURRENT_TIMESTAMP AS DATE);->2023-10-27(截断时间部分)
-
value::type- 功能: PostgreSQL 特有的类型转换简写(功能等同于
CAST)。 - 示例:
SELECT '123'::INTEGER;->123SELECT '2023-10-27'::DATE;->2023-10-27
- 功能: PostgreSQL 特有的类型转换简写(功能等同于
-
TO_DATE(text, format)- 功能: 根据指定格式将字符串转换为日期。
- 示例:
SELECT TO_DATE('27/10/2023', 'DD/MM/YYYY');->2023-10-27
-
TO_TIMESTAMP(text, format)- 功能: 根据指定格式将字符串转换为带时区的时间戳。
- 示例:
SELECT TO_TIMESTAMP('27-10-2023 14:30:00', 'DD-MM-YYYY HH24:MI:SS');->2023-10-27 14:30:00+00(时区取决于设置)
六、聚合函数 (常与 GROUP BY 一起使用)
-
COUNT(*)/COUNT(expression)- 功能: 计算行数(
COUNT(*))或非NULL值的行数(COUNT(expression))。 - 示例:
SELECT COUNT(*) FROM orders;(总订单数),SELECT COUNT(customer_id) FROM orders;(有客户的订单数 -customer_id非NULL的行数)
- 功能: 计算行数(
-
SUM(expression)- 功能: 计算数值表达式在所有行中的总和。
- 示例:
SELECT SUM(amount) FROM payments;(总支付金额)
-
AVG(expression)- 功能: 计算数值表达式在所有行中的平均值。
- 示例:
SELECT AVG(price) FROM products;(平均价格)
-
MIN(expression)- 功能: 返回表达式在所有行中的最小值。
- 示例:
SELECT MIN(created_at) FROM events;(最早的事件时间)
-
MAX(expression)- 功能: 返回表达式在所有行中的最大值。
- 示例:
SELECT MAX(price) FROM products;(最高价格)
-
STRING_AGG(expression, delimiter [ORDER BY ...])- 功能: 将分组内非
NULL的expression值用指定的delimiter连接成一个字符串。可选的ORDER BY指定连接顺序。 - 示例:
SELECT department_id, STRING_AGG(employee_name, ', ' ORDER BY hire_date) FROM employees GROUP BY department_id;(列出每个部门的员工名字,按入职日期排序,逗号分隔)
- 功能: 将分组内非
重要提示
- 官方文档是你的朋友: 这是最权威、最全面的参考。搜索 "PostgreSQL [函数名]" 通常能找到官方文档链接。
- 函数重载: 很多函数名相同但参数类型不同(如
ROUND处理numeric和double precision)。 - 时区: 处理时间戳时要特别注意时区设置 (
timezone配置参数)。 - NULL 处理: 理解函数如何处理
NULL输入非常重要(如COUNT(*)与COUNT(column)的区别,SUM忽略NULL)。 - 正则表达式: PostgreSQL 有强大的正则表达式支持(
~,!~,~*,!~*,REGEXP_MATCH,REGEXP_REPLACE,REGEXP_SPLIT_TO_ARRAY,REGEXP_SPLIT_TO_TABLE),非常适用于复杂字符串处理。
这份列表涵盖了最常用的核心函数。实际应用中,根据具体需求查阅官方文档是最高效的方法。
这篇博客到这里就接近尾声了,希望我的分享能给您带来一些启发和帮助,别忘了点赞、收藏。您的每一次互动、鼓励是我持续创作的动力!期待与您再次相遇,共同探索更广阔的世界!