1. PostgreSQL系统函数概述
作为一款功能强大的开源关系型数据库,PostgreSQL提供了丰富的内置系统函数,这些函数是日常数据库管理和开发工作中不可或缺的工具。我在实际运维工作中发现,熟练掌握这些系统函数能极大提升工作效率,有时甚至能避免编写复杂的存储过程。
PostgreSQL系统函数覆盖了字符串处理、数学计算、日期时间操作、类型转换、系统信息获取等多个领域。合理运用这些函数可以简化SQL语句、优化查询性能,并实现一些常规SQL难以完成的操作。本文将重点介绍那些经过实战检验的高频实用函数。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 字符串处理函数
2.1 基础字符串操作
sql复制-- 字符串连接
SELECT concat('Post', 'greSQL'); -- 输出:PostgreSQL
SELECT 'Post' || 'greSQL'; -- 同样输出PostgreSQL
-- 大小写转换
SELECT lower('PostgreSQL'); -- 输出:postgresql
SELECT upper('postgresql'); -- 输出:POSTGRESQL
-- 字符串裁剪
SELECT trim(' PostgreSQL '); -- 输出:PostgreSQL(去首尾空格)
SELECT ltrim(' PostgreSQL'); -- 只去左边空格
SELECT rtrim('PostgreSQL '); -- 只去右边空格
注意:在PostgreSQL中,concat函数相比||操作符的一个优势是可以处理NULL值。concat(NULL,'text')会返回'text',而NULL||'text'则返回NULL。
2.2 子字符串与模式匹配
sql复制-- 提取子串
SELECT substring('PostgreSQL' from 5 for 3); -- 从第5字符开始取3个,输出:gre
-- 正则表达式匹配
SELECT 'PostgreSQL' ~ '^Post'; -- 是否以Post开头,返回布尔值true
SELECT regexp_replace('foo bar baz', 'b[aeiou]', 'X', 'g'); -- 将ba/be/bi等替换为X
-- 字符串分割
SELECT split_part('a,b,c', ',', 2); -- 按逗号分割后取第2部分,输出:b
在实际应用中,我经常使用regexp_matches函数从文本中提取结构化数据。例如从日志中提取IP地址:
sql复制SELECT (regexp_matches(log_content, '(\d+\.\d+\.\d+\.\d+)'))[1]
FROM server_logs;
3. 日期时间函数
3.1 时间获取与计算
sql复制-- 当前时间
SELECT now(); -- 带时区的时间戳
SELECT current_date; -- 当前日期
SELECT current_time; -- 当前时间
-- 时间计算
SELECT now() + interval '1 day'; -- 加1天
SELECT now() - interval '2 hours'; -- 减2小时
-- 提取时间部分
SELECT date_part('hour', now()); -- 提取当前小时数
SELECT extract(year from now()); -- 提取年份
经验分享:在处理跨国业务时,务必注意时区问题。我推荐在数据库中统一使用UTC时间存储,仅在展示时转换为本地时区。可以使用AT TIME ZONE子句进行转换:
sql复制SELECT now() AT TIME ZONE 'UTC' AT TIME ZONE 'Asia/Shanghai';
3.2 时间格式化与解析
sql复制-- 时间格式化
SELECT to_char(now(), 'YYYY-MM-DD HH24:MI:SS'); -- 输出:2023-03-09 14:25:36
-- 字符串转时间
SELECT to_timestamp('20230309', 'YYYYMMDD'); -- 将字符串转为时间戳
在日志分析场景中,我经常需要将不同格式的时间字符串标准化:
sql复制-- 处理多种日期格式
SELECT CASE
WHEN log_date ~ '^\d{4}-\d{2}-\d{2}$' THEN to_date(log_date, 'YYYY-MM-DD')
WHEN log_date ~ '^\d{8}$' THEN to_date(log_date, 'YYYYMMDD')
ELSE NULL
END AS unified_date
FROM application_logs;
4. 数学与统计函数
4.1 基础数学运算
sql复制SELECT abs(-10); -- 绝对值:10
SELECT ceil(3.14); -- 向上取整:4
SELECT floor(3.78); -- 向下取整:3
SELECT round(3.14159, 2); -- 四舍五入保留2位小数:3.14
SELECT trunc(3.14159, 3); -- 截断保留3位小数:3.141
4.2 统计与聚合函数
sql复制-- 基础聚合
SELECT avg(salary), max(salary), min(salary) FROM employees;
-- 统计函数
SELECT stddev(salary) FROM employees; -- 标准差
SELECT variance(salary) FROM employees; -- 方差
-- 高级窗口函数
SELECT
employee_id,
salary,
rank() OVER (ORDER BY salary DESC) as salary_rank
FROM employees;
在数据分析报表中,我经常结合窗口函数和聚合函数实现复杂计算:
sql复制SELECT
department,
employee,
salary,
salary -
