字符串函数
长度、截取、拼接
SELECT LENGTH('hello'); -- 5 获取字符串长度
SELECT LEFT('PostgreSQL', 4); -- 'Post' 获取左侧 4 个字符
SELECT RIGHT('PostgreSQL', 4);-- 'SQL' 获取右侧 4 个字符
SELECT CONCAT('Hello', ' ', 'World'); -- 'Hello World' 字符串拼接
SELECT 'Hello' || ' World' as hello; -- 'Hello World' 另一种拼接方式
大小写转换
SELECT UPPER('hello'); -- 'HELLO' 转换为大写
SELECT LOWER('HELLO'); -- 'hello' 转换为小写
SELECT INITCAP('hello world'); -- 'Hello World' 每个单词首字母大写
去空格
SELECT TRIM(' hello '); -- 'hello' 去掉两端空格
SELECT LTRIM(' hello'); -- 'hello' 去掉左侧空格
SELECT RTRIM('hello '); -- 'hello' 去掉右侧空格
查找与替换
SELECT POSITION('SQL' IN 'PostgreSQL'); -- 9 查找子字符串位置
SELECT REPLACE('hello world', 'world', 'PostgreSQL'); -- 'hello PostgreSQL' 替换
SELECT SUBSTRING('PostgreSQL' FROM 5 FOR 3); -- 'gre' 截取子字符串
日期和时间
SELECT NOW(); -- 获取当前时间戳
SELECT CURRENT_DATE; -- 获取当前日期
SELECT CURRENT_TIME; -- 获取当前时间
SELECT CURRENT_TIMESTAMP; -- 获取当前时间戳
SELECT EXTRACT(YEAR FROM NOW()); -- 获取当前年份
SELECT DATE_PART('month', NOW()); -- 获取当前月份
SELECT AGE(CURRENT_DATE, '2023-12-21'); -- 计算年月日差
SELECT DATE_TRUNC('month', NOW()); -- 截断到月份 '2025-03-01 00:00:00'
SELECT NOW() + INTERVAL '5 days'; -- 计算未来 5 天的日期
SELECT NOW() - INTERVAL '1 hour'; -- 计算 1 小时前的时间
SELECT TO_CHAR(NOW(), 'YYYY-MM-DD HH24:MI:SS'); -- 格式化日期
数学
SELECT ABS(-10); -- 10 绝对值
SELECT CEIL(4.3); -- 5 向上取整
SELECT FLOOR(4.9); -- 4 向下取整
SELECT ROUND(4.567, 2);-- 4.57 取小数
SELECT POWER(2, 3); -- 8 幂运算 (2^3)
SELECT SQRT(16); -- 4 开平方
SELECT RANDOM(); -- 生成 0~1 之间的随机数
SELECT PI(); -- 3.141592653589793 圆周率
SELECT EXP(1); -- 2.718281828459045 e 的指数
SELECT LOG(10); -- 2.302585092994046 以 e 为底的对数
条件判断
SELECT COALESCE(NULL, 'default'); -- 'default' 返回第一个非 NULL 值
SELECT NULLIF(10, 10); -- NULL 如果两个值相等,则返回 NULL
SELECT CASE
WHEN age < 18 THEN '未成年'
WHEN age BETWEEN 18 AND 60 THEN '成年'
ELSE '老年'
END AS age_group FROM people;
数组
SELECT ARRAY[1, 2, 3] || ARRAY[4, 5]; -- {1,2,3,4,5} 数组合并
SELECT ARRAY_APPEND(ARRAY[1, 2], 3); -- {1,2,3} 增加
SELECT ARRAY_REMOVE(ARRAY[1, 2, 3], 2); -- {1,3} 移除元素
SELECT UNNEST(ARRAY[1,2,3]); -- 拆分数组
Json
SELECT '{"name": "Alice", "age": 25}'::json->>'name'; -- 'Alice'
SELECT '{"a": {"b": "c"}}'::jsonb #>> '{a,b}'; -- 'c' 访问 JSON 数据
SELECT jsonb_build_object('name', 'Bob', 'age', 30); -- 生成Json数据
SELECT jsonb_array_elements('[1,2,3]'::jsonb); -- 拆解 JSON 数组
序列和 ID 处理
-- 创建序列
CREATE SEQUENCE my_sequence
START WITH 1 -- 起始值
INCREMENT BY 1 -- 每次递增的值
MINVALUE 1 -- 最小值
MAXVALUE 1000 -- 最大值(可选)
CYCLE; -- 达到最大值后是否循环(可选)
SELECT nextval('my_sequence'); -- 获取下一个序列值
SELECT currval('my_sequence'); -- 获取当前序列值
SELECT setval('my_sequence', 100); -- 设置序列当前值
DROP SEQUENCE my_sequence; -- 删除
实用函数
SELECT MD5('password'); -- 计算 MD5 哈希值
SELECT PG_SLEEP(5); -- 让查询暂停 5 秒
SELECT VERSION(); -- 获取 PostgreSQL 版本
SELECT PG_SIZE_PRETTY(PG_DATABASE_SIZE('mydb')); -- 获取数据库大小
聚合函数
应该没人不知道这些吧~
SELECT COUNT(*) FROM users; -- 统计行数
SELECT MAX(salary) FROM employees; -- 最高工资
SELECT MIN(salary) FROM employees; -- 最低工资
SELECT AVG(salary) FROM employees; -- 平均工资
SELECT SUM(salary) FROM employees; -- 工资总和
SELECT STRING_AGG(name, ', ') FROM users; -- 拼接字符串