Postgresql常用函数操作

目录

一、字符串函数

二、数学函数

三、日期和时间函数

四、条件表达式函数

五、类型转换函数

六、聚合函数 (常与 GROUP BY 一起使用)

重要提示


PostgreSQL 提供了极其丰富的内置函数,用于操作和处理数据。以下是一些最常用的函数分类和示例:

一、字符串函数

  1. CONCAT(str1, str2, ...) / str1 || str2 || ...

    • 功能: 连接字符串。
    • 示例: SELECT CONCAT('Hello', ' ', 'World');SELECT 'Hello' || ' ' || 'World'; -> 'Hello World'
  2. LENGTH(str) / CHAR_LENGTH(str)

    • 功能: 返回字符串的字符数。
    • 示例: SELECT LENGTH('PostgreSQL'); -> 10
  3. UPPER(str)

    • 功能: 将字符串转换为大写。
    • 示例: SELECT UPPER('hello'); -> 'HELLO'
  4. LOWER(str)

    • 功能: 将字符串转换为小写。
    • 示例: SELECT LOWER('SQL'); -> 'sql'
  5. 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'
  6. 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' (注意:SUBSTRstart 位置行为在某些版本/设置下可能不同,推荐用 SUBSTRING)
  7. REPLACE(str, from_str, to_str)

    • 功能: 将字符串中出现的所有 from_str 替换为 to_str
    • 示例: SELECT REPLACE('foo bar baz', 'bar', 'qux'); -> 'foo qux baz'
  8. SPLIT_PART(str, delimiter, field_num)

    • 功能: 根据分隔符拆分字符串,并返回指定字段编号的部分(从1开始)。
    • 示例: SELECT SPLIT_PART('john.doe@example.com', '.', 2); -> 'doe@example' (取第二个点之前的部分)
  9. POSITION(substring IN str)

    • 功能: 返回子串在字符串中第一次出现的位置(从1开始),找不到则返回0。
    • 示例: SELECT POSITION('SQL' IN 'PostgreSQL'); -> 8
  10. LEFT(str, n) / RIGHT(str, n)

    • 功能: 返回字符串左边/右边的 n 个字符。
    • 示例: SELECT LEFT('PostgreSQL', 4); -> 'Post', SELECT RIGHT('PostgreSQL', 3); -> 'SQL'

二、数学函数

  1. ROUND(value [, precision])

    • 功能: 将数值四舍五入到指定的小数位数(precision,默认为0)。
    • 示例: SELECT ROUND(123.4567, 2); -> 123.46, SELECT ROUND(123.4567); -> 123
  2. CEIL(value) / CEILING(value)

    • 功能: 返回大于或等于参数的最小整数(向上取整)。
    • 示例: SELECT CEIL(123.45); -> 124, SELECT CEIL(-123.45); -> -123
  3. FLOOR(value)

    • 功能: 返回小于或等于参数的最大整数(向下取整)。
    • 示例: SELECT FLOOR(123.45); -> 123, SELECT FLOOR(-123.45); -> -124
  4. ABS(value)

    • 功能: 返回数值的绝对值。
    • 示例: SELECT ABS(-15); -> 15
  5. POWER(base, exponent)

    • 功能: 返回 baseexponent 次幂。
    • 示例: SELECT POWER(2, 3); -> 8
  6. SQRT(value)

    • 功能: 返回数值的平方根。
    • 示例: SELECT SQRT(9); -> 3
  7. MOD(dividend, divisor)

    • 功能: 返回 dividend 除以 divisor 的余数(模运算)。
    • 示例: SELECT MOD(10, 3); -> 1
  8. RANDOM()

    • 功能: 返回一个范围在 [0.0, 1.0) 的随机浮点数。
    • 示例: SELECT RANDOM(); -> 0.123456789... (每次不同)
  9. PI()

    • 功能: 返回圆周率 π 的值。
    • 示例: SELECT PI(); -> 3.141592653589793
  10. 三角函数 (SIN, COS, TAN, ASIN, ACOS, ATAN, ATAN2)

    • 功能: 执行标准的三角函数计算(参数通常为弧度)。
    • 示例: SELECT SIN(PI()/2); -> 1.0

三、日期和时间函数

  1. CURRENT_DATE

    • 功能: 返回当前日期(不含时间)。
    • 示例: SELECT CURRENT_DATE; -> 2023-10-27 (取决于执行日期)
  2. CURRENT_TIME / CURRENT_TIME(precision)

    • 功能: 返回当前时间(不含日期),可指定精度。
    • 示例: SELECT CURRENT_TIME; -> 14:30:15.123456+08 (取决于执行时间和时区)
  3. CURRENT_TIMESTAMP / CURRENT_TIMESTAMP(precision) / NOW()

    • 功能: 返回当前日期和时间(带时区),可指定精度。NOW()CURRENT_TIMESTAMP 的同义词。
    • 示例: SELECT CURRENT_TIMESTAMP; -> 2023-10-27 14:30:15.123456+08
  4. EXTRACT(field FROM source)

    • 功能: 从日期/时间/时间间隔值中提取指定的部分(年、月、日、小时、分钟、秒等)。
    • 示例:
      • SELECT EXTRACT(YEAR FROM CURRENT_DATE); -> 2023
      • SELECT EXTRACT(MONTH FROM TIMESTAMP '2023-10-27 15:00:00'); -> 10
      • SELECT EXTRACT(DAY FROM CURRENT_DATE); -> 27
      • SELECT EXTRACT(HOUR FROM CURRENT_TIME); -> 14 (取决于当前时间)
  5. DATE_PART('field', source)

    • 功能: 功能与 EXTRACT 完全相同,是 PostgreSQL 的历史函数形式。推荐使用标准的 EXTRACT
    • 示例: SELECT DATE_PART('dow', CURRENT_DATE); -> 5 (返回星期几,0=周日, 1=周一, ..., 6=周六)
  6. AGE([timestamp1, ] timestamp2)

    • 功能: 当只有一个参数时,计算该时间戳到当前日期的间隔。当有两个参数时,计算 timestamp1timestamp2 的间隔。
    • 示例:
      • 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
  7. DATE_TRUNC('precision', source)

    • 功能: 将日期/时间值截断到指定的精度(年、季度、月、周、日、小时等),返回该精度的开始时刻。
    • 示例:
      • SELECT DATE_TRUNC('month', TIMESTAMP '2023-10-27 14:30:15'); -> 2023-10-01 00:00:00
      • SELECT DATE_TRUNC('hour', CURRENT_TIMESTAMP); -> 2023-10-27 14:00:00+08 (取决于当前时间)
  8. 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(月份全称)。
  9. INTERVAL 'string'

    • 功能: 构造一个时间间隔值。
    • 示例:
      • SELECT CURRENT_TIMESTAMP + INTERVAL '1 day 2 hours'; (一天两小时之后)
      • SELECT CURRENT_DATE - INTERVAL '1 week'; (一周之前)

四、条件表达式函数

  1. COALESCE(value1, value2, ..., valuen)

    • 功能: 返回参数列表中第一个非 NULL 的值。常用于处理可能为 NULL 的字段并提供默认值。
    • 示例: SELECT COALESCE(description, 'No description provided') FROM products; (如果 descriptionNULL,则返回 'No description provided')
  2. NULLIF(value1, value2)

    • 功能: 如果 value1 等于 value2,则返回 NULL;否则返回 value1。常用于避免除零错误或特定比较。
    • 示例:
      • SELECT NULLIF(0, 0); -> NULL
      • SELECT 100 / NULLIF(column_value, 0); (避免除零错误)
  3. GREATEST(value1, value2, ...)

    • 功能: 返回参数列表中的最大值。
    • 示例: SELECT GREATEST(10, 5, 20, 15); -> 20
  4. LEAST(value1, value2, ...)

    • 功能: 返回参数列表中的最小值。
    • 示例: SELECT LEAST(10, 5, 20, 15); -> 5
  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;

五、类型转换函数

  1. CAST(value AS type)

    • 功能: 标准的类型转换运算符。
    • 示例:
      • SELECT CAST('123' AS INTEGER); -> 123
      • SELECT CAST(CURRENT_TIMESTAMP AS DATE); -> 2023-10-27 (截断时间部分)
  2. value::type

    • 功能: PostgreSQL 特有的类型转换简写(功能等同于 CAST)。
    • 示例:
      • SELECT '123'::INTEGER; -> 123
      • SELECT '2023-10-27'::DATE; -> 2023-10-27
  3. TO_DATE(text, format)

    • 功能: 根据指定格式将字符串转换为日期。
    • 示例: SELECT TO_DATE('27/10/2023', 'DD/MM/YYYY'); -> 2023-10-27
  4. 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 一起使用)

  1. COUNT(*) / COUNT(expression)

    • 功能: 计算行数(COUNT(*))或非 NULL 值的行数(COUNT(expression))。
    • 示例: SELECT COUNT(*) FROM orders; (总订单数), SELECT COUNT(customer_id) FROM orders; (有客户的订单数 - customer_idNULL 的行数)
  2. SUM(expression)

    • 功能: 计算数值表达式在所有行中的总和。
    • 示例: SELECT SUM(amount) FROM payments; (总支付金额)
  3. AVG(expression)

    • 功能: 计算数值表达式在所有行中的平均值。
    • 示例: SELECT AVG(price) FROM products; (平均价格)
  4. MIN(expression)

    • 功能: 返回表达式在所有行中的最小值。
    • 示例: SELECT MIN(created_at) FROM events; (最早的事件时间)
  5. MAX(expression)

    • 功能: 返回表达式在所有行中的最大值。
    • 示例: SELECT MAX(price) FROM products; (最高价格)
  6. STRING_AGG(expression, delimiter [ORDER BY ...])

    • 功能: 将分组内非 NULLexpression 值用指定的 delimiter 连接成一个字符串。可选的 ORDER BY 指定连接顺序。
    • 示例: SELECT department_id, STRING_AGG(employee_name, ', ' ORDER BY hire_date) FROM employees GROUP BY department_id; (列出每个部门的员工名字,按入职日期排序,逗号分隔)

重要提示

  1. 官方文档是你的朋友: 这是最权威、最全面的参考。搜索 "PostgreSQL [函数名]" 通常能找到官方文档链接。
  2. 函数重载: 很多函数名相同但参数类型不同(如 ROUND 处理 numericdouble precision)。
  3. 时区: 处理时间戳时要特别注意时区设置 (timezone 配置参数)。
  4. NULL 处理: 理解函数如何处理 NULL 输入非常重要(如 COUNT(*)COUNT(column) 的区别,SUM 忽略 NULL)。
  5. 正则表达式: PostgreSQL 有强大的正则表达式支持(~, !~, ~*, !~*, REGEXP_MATCH, REGEXP_REPLACE, REGEXP_SPLIT_TO_ARRAY, REGEXP_SPLIT_TO_TABLE),非常适用于复杂字符串处理。

这份列表涵盖了最常用的核心函数。实际应用中,根据具体需求查阅官方文档是最高效的方法。


这篇博客到这里就接近尾声了,希望我的分享能给您带来一些启发和帮助,别忘了点赞、收藏。您的每一次互动、鼓励是我持续创作的动力!期待与您再次相遇,共同探索更广阔的世界!

相关推荐
阿里小阿希1 小时前
Vue3 + Element Plus 项目中日期时间处理的最佳实践与数据库设计规范
数据库·设计规范
白鹭2 小时前
MySQL源码部署(rhel7)
数据库·mysql
666和7772 小时前
Struts2 工作总结
java·数据库
还听珊瑚海吗2 小时前
SpringMVC(一)
数据库
星期天要睡觉4 小时前
MySQL 综合练习
数据库·mysql
Y4090014 小时前
数据库基础知识——聚合函数、分组查询
android·数据库
JosieBook5 小时前
【数据库】MySQL 数据库创建存储过程及使用场景详解
数据库·mysql
处女座_三月5 小时前
改 TDengine 数据库的时间写入限制
数据库·sql·mysql