本文整理了一些跨数据库平台通用的 SQL 技巧。
CASE WHEN 条件表达式
CASE WHEN 是 SQL 中强大的条件表达式,用于在查询中实现条件逻辑:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| SELECT (CASE Gender WHEN 1 THEN '男' WHEN 2 THEN '女' ELSE '其他' END) AS Gender FROM Table1;
SELECT (CASE WHEN age < 18 THEN '未成年' WHEN age >= 18 AND age < 60 THEN '成年' ELSE '老年' END) AS age_group FROM users;
|
使用场景:
- 数据转换(如状态码转文字)
- 条件聚合统计
- 动态列值计算
参考: 麒麟.NET - SQL中的CASE WHEN语句
DELETE 与 JOIN
不同数据库中使用 JOIN 进行 DELETE 的语法有所不同。
SQL Server 语法
1 2 3 4
| DELETE w FROM WorkRecord2 w INNER JOIN Employee e ON EmployeeRun = EmployeeNo WHERE Company = '1' AND Date = '2013-05-06';
|
MySQL 语法
1 2 3 4 5 6 7 8 9 10
| DELETE w FROM WorkRecord2 w, Employee e WHERE w.EmployeeRun = e.EmployeeNo AND e.Company = '1' AND w.Date = '2013-05-06';
DELETE w FROM WorkRecord2 w JOIN Employee e ON w.EmployeeRun = e.EmployeeNo WHERE e.Company = '1' AND w.Date = '2013-05-06';
|
PostgreSQL 语法
1 2 3 4
| DELETE FROM WorkRecord2 w USING Employee e WHERE w.EmployeeRun = e.EmployeeNo AND e.Company = '1' AND w.Date = '2013-05-06';
|
ORM 与框架
Hibernate 大小写问题
使用 Hibernate 时可能遇到表名大小写不匹配的问题:
1
| org.hibernate.engine.jdbc.spi.SqlExceptionHelper: Table 'authorities' doesn't exist
|
原因:数据库配置为大小写敏感(特别是 Linux 环境下的 MySQL)
解决方案:
- 确保实体类的表名注解与数据库一致
- 或配置数据库为大小写不敏感(参考 MySQL 的
lower_case_table_names 设置)
1 2 3 4 5 6
| @Entity @Table(name = "authorities") public class Authority { }
|
数据库脚手架
脚手架(Scaffolding)是一种元编程方法,用于快速生成数据库操作代码:
- 程序员编写规格说明,描述如何使用数据库
- 脚手架编译器根据规格生成 CRUD 代码
- 常见于 MVC 框架(Rails、Django Admin 等)
这种方式可以快速构建数据库应用的基础结构,然后在此基础上进行定制开发。
参考链接