本文整理了一些跨数据库平台通用的 SQL 技巧。

CASE WHEN 条件表达式

CASE WHEN 是 SQL 中强大的条件表达式,用于在查询中实现条件逻辑:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
-- 简单 CASE 语法
SELECT
(CASE Gender
WHEN 1 THEN '男'
WHEN 2 THEN '女'
ELSE '其他'
END) AS Gender
FROM Table1;

-- 搜索 CASE 语法(更灵活)
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';

-- 或使用 JOIN 语法
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)

解决方案

  1. 确保实体类的表名注解与数据库一致
  2. 或配置数据库为大小写不敏感(参考 MySQL 的 lower_case_table_names 设置)
1
2
3
4
5
6
// 明确指定表名
@Entity
@Table(name = "authorities") // 使用小写
public class Authority {
// ...
}

数据库脚手架

脚手架(Scaffolding)是一种元编程方法,用于快速生成数据库操作代码:

  • 程序员编写规格说明,描述如何使用数据库
  • 脚手架编译器根据规格生成 CRUD 代码
  • 常见于 MVC 框架(Rails、Django Admin 等)

这种方式可以快速构建数据库应用的基础结构,然后在此基础上进行定制开发。

参考链接