在 PostgreSQL 中,函数就像是**“内置的小工具”**,能帮你直接在 SQL 层把原始数据加工成最终需要的格式。
我们可以把常用的函数分为四大类:字符串处理、数值计算、日期时间以及聚合处理。
字符串处理函数(清洗数据的利器)
当你的文件路径、用户名格式不统一时,这些函数能帮大忙。
CONCAT(a, b)/||:拼接字符串。UPPER()/LOWER():转换大小写。SUBSTR(string, start, len):截取字符串。REPLACE(string, from, to):替换内容。COALESCE(value, default):【超级常用】 如果字段是 NULL,就给它一个默认值。
数值计算函数
ROUND(numeric, 2):四舍五入。CEIL()/FLOOR():向上/向下取整。ABS():取绝对值。
日期时间函数(时间管理的灵魂)
NOW():获取当前完整时间。CURRENT_DATE:获取当前日期。AGE(timestamp):计算时间差。
-- 看看这个文件上传了多久了
SET TIME ZONE 'Asia/Shanghai';
SELECT file_name, AGE(created_at) AS active_time FROM file_details;
EXTRACT(field FROM source):提取年、月、日、小时。
-- 统计每个小时的上传量
SELECT EXTRACT(HOUR FROM created_at) AS hour, COUNT(*)
FROM file_details GROUP BY hour;
TO_CHAR():将时间格式化为字符串。
-- 变成类似 2026-04-14 14:30:00 的格式
SELECT TO_CHAR(created_at, 'YYYY-MM-DD HH24:MI:SS') FROM file_details;
流程控制与聚合函数
CASE WHEN:SQL 里的if-else。
-- 给文件分等级
SELECT file_name,
CASE
WHEN file_size > 1024*1024*100 THEN '大文件'
WHEN file_size > 1024*1024*10 THEN '中文件'
ELSE '小文件'
END AS file_level
FROM files;
STRING_AGG(field, delimiter):【PG特色】 把多行结果合并成一行字符串。
-- 把某个用户的所有标签拼成一个逗号分隔的字符串
SELECT uploader_ip, STRING_AGG(tags::text, ' | ') FROM file_details GROUP BY uploader_ip;
或者
SELECT
uploader_ip,
-- 先把所有数组合并成一个大数组,再转为字符串
array_to_string(array_agg(unnest_tags), ', ')
FROM (
SELECT uploader_ip, unnest(tags) AS unnest_tags FROM file_details
) t
GROUP BY uploader_ip;