主题
表达式技巧
在 PostgreSQL 中,表达式是由常量、运算符、函数、列名等组成的。熟练掌握表达式技巧,能显著提高查询的效率和灵活性。
条件表达式
CASE 表达式
CASE
表达式允许在 SQL 查询中执行条件逻辑。
简单 CASE 表达式
sql
SELECT name,
CASE department_id
WHEN 1 THEN 'HR'
WHEN 2 THEN 'Engineering'
ELSE 'Other'
END AS department_name
FROM employees;
搜索 CASE 表达式
sql
SELECT name,
CASE
WHEN salary > 100000 THEN 'High Salary'
WHEN salary BETWEEN 50000 AND 100000 THEN 'Medium Salary'
ELSE 'Low Salary'
END AS salary_level
FROM employees;
COALESCE 表达式
COALESCE
函数返回第一个非 NULL 的值。
sql
SELECT name, COALESCE(phone_number, 'N/A') AS contact FROM employees;
NULLIF 表达式
NULLIF
函数在两个值相等时返回 NULL,否则返回第一个值。
sql
SELECT name, NULLIF(salary, 0) AS adjusted_salary FROM employees;
数学表达式
PostgreSQL 提供了丰富的数学运算符和函数,用于处理数值类型的运算。
数学运算符
+
:加法-
:减法*
:乘法/
:除法%
:取余
sql
SELECT salary * 1.1 AS increased_salary FROM employees;
SELECT salary % 1000 AS salary_remainder FROM employees;
使用常量
PostgreSQL 允许在查询中使用常量,例如:
sql
SELECT salary + 5000 AS salary_with_bonus FROM employees;
字符串表达式
字符串连接
使用 ||
运算符进行字符串连接。
sql
SELECT first_name || ' ' || last_name AS full_name FROM employees;
字符串的模式匹配
LIKE
:模糊匹配ILIKE
:不区分大小写的模糊匹配
sql
SELECT name FROM employees WHERE name LIKE 'A%';
SELECT name FROM employees WHERE name ILIKE 'a%';
正则表达式匹配
PostgreSQL 支持通过正则表达式进行复杂的模式匹配。
~
:匹配正则表达式~*
:不区分大小写的正则匹配
sql
SELECT name FROM employees WHERE name ~ '^A.*';
SELECT name FROM employees WHERE email ~* 'example.com';
日期与时间表达式
日期运算
PostgreSQL 允许对日期进行加减运算,支持使用 INTERVAL
类型。
sql
SELECT CURRENT_DATE + INTERVAL '1 month' AS next_month;
SELECT CURRENT_DATE - INTERVAL '1 day' AS yesterday;
日期格式化
使用 TO_CHAR
函数格式化日期或时间值。
sql
SELECT TO_CHAR(CURRENT_DATE, 'YYYY-MM-DD') AS formatted_date;
SELECT TO_CHAR(CURRENT_TIMESTAMP, 'DD-Mon-YYYY HH24:MI:SS') AS formatted_time;
提取日期部分
使用 EXTRACT
函数提取日期的特定部分,如年、月、日等。
sql
SELECT EXTRACT(YEAR FROM CURRENT_DATE) AS current_year;
SELECT EXTRACT(MONTH FROM CURRENT_DATE) AS current_month;
集合与数组表达式
PostgreSQL 支持数组和集合操作,可以方便地处理多个值。
数组构造
使用 {}
来构造数组。
sql
SELECT ARRAY[1, 2, 3] AS numbers;
SELECT ARRAY['a', 'b', 'c'] AS letters;
数组操作
PostgreSQL 提供了多种操作符和函数用于数组操作。
array_length()
:返回数组的长度array_append()
:向数组中添加元素
sql
SELECT array_length(ARRAY[1, 2, 3], 1) AS array_size;
SELECT array_append(ARRAY[1, 2, 3], 4) AS updated_array;
ANY 和 ALL 操作符
ANY
和 ALL
用于与集合中的元素进行比较。
sql
SELECT * FROM employees WHERE salary > ANY (SELECT salary FROM employees WHERE department_id = 1);
SELECT * FROM employees WHERE salary > ALL (SELECT salary FROM employees WHERE department_id = 1);
聚合与窗口函数
PostgreSQL 提供了强大的聚合和窗口函数,用于在查询中进行数据聚合和排序计算。
聚合函数
如 SUM
、AVG
、COUNT
、MAX
、MIN
等可以在查询中进行统计计算。
sql
SELECT department, AVG(salary) AS average_salary FROM employees GROUP BY department;
窗口函数
窗口函数允许在查询中对分组后的数据进行进一步操作,如排名、累计等。
sql
SELECT name, salary, RANK() OVER (ORDER BY salary DESC) AS rank
FROM employees;
小结
表达式技巧是 PostgreSQL 查询中不可或缺的部分,通过合理使用各种运算符、函数和表达式,可以提升查询效率和复杂度,满足多种复杂的数据处理需求。掌握这些技巧有助于优化数据查询和操作,提高数据库的使用效能。