SQL Server 转 PostgreSQL 注意事项
·
1. 等于和不等于操作符
| SQL Server | PostgreSQL | 说明 |
|---|---|---|
= |
= |
等于(相同) |
!= 或 <> |
<> 或 != |
不等于(PostgreSQL 两者都支持,但推荐使用 <>) |
2. NULL 值比较
| SQL Server | PostgreSQL | 说明 |
|---|---|---|
IS NULL |
IS NULL |
相同 |
IS NOT NULL |
IS NOT NULL |
相同 |
= NULL |
无效 | SQL Server 中 = NULL 总是返回 UNKNOWN,PostgreSQL 中会报错 |
<> NULL |
无效 | 同上 |
最佳实践:永远使用 IS NULL 或 IS NOT NULL 来检查 NULL 值
3. 字符串比较
| 注意事项 | SQL Server | PostgreSQL |
|---|---|---|
| 大小写敏感 | 默认不敏感 | 默认敏感 |
| 排序规则 | 可指定 | 可指定 |
| 空字符串与NULL | '' 与 NULL 不同 |
'' 与 NULL 不同 |
解决方案:
-
如需不敏感比较,PostgreSQL 中使用
WHERE lower(column) = lower('value') -
或使用
WHERE column ILIKE 'value'
4. LIKE 操作符
| SQL Server | PostgreSQL | 说明 |
|---|---|---|
LIKE |
LIKE |
相同 |
NOT LIKE |
NOT LIKE |
相同 |
% 通配符 |
% 通配符 |
相同 |
_ 通配符 |
_ 通配符 |
相同 |
[a-z] 模式 |
[a-z] 无效 |
PostgreSQL 使用 SIMILAR TO 或正则表达式 |
转换示例:
sql
-- SQL Server
WHERE name LIKE '[A-Z]%'
-- PostgreSQL
WHERE name ~ '^[A-Z]' -- 使用正则表达式
-- 或
WHERE name SIMILAR TO '[A-Z]%'
5. TOP 与 LIMIT
| SQL Server | PostgreSQL | 说明 |
|---|---|---|
TOP n |
LIMIT n |
限制返回行数 |
转换示例:
sql
-- SQL Server
SELECT TOP 10 * FROM table
-- PostgreSQL
SELECT * FROM table LIMIT 10
6. 日期比较
| SQL Server | PostgreSQL | 说明 |
|---|---|---|
GETDATE() |
now() |
当前日期时间 |
DATEDIFF(day, date1, date2) |
date2 - date1 |
日期差 |
转换示例:
sql
-- SQL Server
WHERE create_date > GETDATE() - 1
-- PostgreSQL
WHERE create_date > now() - interval '1 day'
7. 类型转换
| SQL Server | PostgreSQL | 说明 |
|---|---|---|
CONVERT(VARCHAR, col) |
CAST(col AS TEXT) 或 col::text |
类型转换 |
TRY_CONVERT() |
CAST(col AS type) 加异常处理 |
PostgreSQL 无 TRY_CONVERT |
8. 布尔值比较
| SQL Server | PostgreSQL | 说明 |
|---|---|---|
bit 类型 (0/1) |
boolean (true/false) |
类型不同 |
转换示例:
sql
-- SQL Server
WHERE is_active = 1
-- PostgreSQL
WHERE is_active = true
最佳实践建议
-
迁移后务必测试所有比较操作
-
特别注意 NULL 值处理差异
-
字符串比较考虑大小写敏感性
-
使用 PostgreSQL 的
EXPLAIN ANALYZE检查查询性能 -
复杂查询考虑重写为 PostgreSQL 优化形式
这些差异是 SQL Server 和 PostgreSQL 语法转换中最常见的比较操作问题,正确转换这些操作符可以避免迁移后的逻辑错误。
更多推荐



所有评论(0)