PgSQL语法
基本格式 JavaScript 复制 db.<集合>.find({ <条件> })条件>集合>
等值匹配 JavaScript 复制 { field: value } 例: JavaScript 复制 { id: “3393633870761476271” }
嵌套字段(用点号) JavaScript 复制 { “state.status”: “running” }
比较运算 JavaScript 复制 { field: { $gt: 0.99 } } // 大于 { field: { $lt: 100 } } // 小于 { field: { $in: [1, 2] } } // 在数组中
数组元素匹配 JavaScript 复制 { sku_id_list: NumberLong(“100028998016”) }
特殊类型 ObjectId:ObjectId(“…”) NumberLong:NumberLong(“123”)
组合条件 JavaScript 复制 { “state.status”: “running”, “state.progress”: { $gt: 0.99 } }
可选:投影(只返回需要的字段) JavaScript 复制 db.collection.find({…}, { id: 1, “state.progress”: 1, _id: 0 })
不等于
1 2 3 4
SELECT * FROM sku WHERE platform = 'pdd' AND (plat_sku_img = '' OR plat_sku_img IS NULL) LIMIT 1;
PostgreSQL 查询语法完整指南
1. 基本格式
1
2
3
SELECT <列名>
FROM <表名>
WHERE <条件>;
2. 等值匹配
1
WHERE field = 'value'
示例:
1
WHERE id = '3393633870761476271'
3. 嵌套字段/JSON(用 -> 或 ->>)
| 运算符 | 含义 | 示例 |
|---|---|---|
-> | 取 JSON 对象/数组 | data->'state' |
->> | 取 JSON 文本值 | data->>'status' |
#> | 按路径取 JSON | data#>'{state,status}' |
#>> | 按路径取文本 | data#>>'{state,status}' |
示例:
1
2
3
WHERE data->>'status' = 'running'
WHERE data->'state'->>'progress' = '0.99'
WHERE data#>>'{state,status}' = 'running'
4. 比较运算
| 运算符 | 含义 | 示例 |
|---|---|---|
= | 等于 | WHERE field = 100 |
<> 或 != | 不等于 | WHERE field <> 100 |
> | 大于 | WHERE field > 0.99 |
>= | 大于等于 | WHERE field >= 100 |
< | 小于 | WHERE field < 100 |
<= | 小于等于 | WHERE field <= 50 |
IN | 在列表中 | WHERE field IN (1, 2, 3) |
NOT IN | 不在列表中 | WHERE field NOT IN (1, 2) |
BETWEEN | 在范围内 | WHERE field BETWEEN 10 AND 20 |
IS NULL | 为空 | WHERE field IS NULL |
IS NOT NULL | 不为空 | WHERE field IS NOT NULL |
LIKE | 模糊匹配 | WHERE name LIKE '%keyword%' |
ILIKE | 忽略大小写模糊匹配 | WHERE name ILIKE '%Keyword%' |
~ | 正则匹配 | WHERE name ~ '^[A-Z]' |
~* | 忽略大小写正则 | WHERE name ~* '^[a-z]' |
5. 数组元素匹配
| 操作 | 语法 | 示例 |
|---|---|---|
| 包含元素 | ANY(array) | WHERE sku_id = ANY(sku_id_list) |
| 包含元素 | <@ | WHERE ARRAY[100028998016] <@ sku_id_list |
| 被包含 | @> | WHERE sku_id_list @> ARRAY[100028998016] |
| 数组长度 | array_length() | WHERE array_length(tags, 1) = 3 |
| 包含所有 | @> | WHERE tags @> ARRAY['red', 'blue'] |
| 重叠 | && | WHERE tags && ARRAY['red', 'green'] |
示例:
1
2
3
4
5
-- 数组包含特定值
WHERE 100028998016 = ANY(sku_id_list)
-- 或
WHERE sku_id_list @> ARRAY[100028998016::bigint]
6. 特殊类型
| 类型 | 语法/函数 |
|---|---|
| UUID | '550e8400-e29b-41d4-a716-446655440000'::uuid |
| BIGINT | 100028998016::bigint 或 CAST(100028998016 AS bigint) |
| TIMESTAMP | '2024-01-01 00:00:00'::timestamp |
| TIMESTAMPTZ | '2024-01-01 00:00:00+08'::timestamptz |
| JSON/JSONB | '{"a":1}'::jsonb |
| INET | '192.168.1.1'::inet |
| ARRAY | ARRAY[1,2,3] 或 '{1,2,3}'::int[] |
7. 组合条件(逻辑运算)
| 运算符 | 含义 | 示例 |
|---|---|---|
AND | 与 | WHERE cond1 AND cond2 |
OR | 或 | WHERE cond1 OR cond2 |
NOT | 非 | WHERE NOT cond |
示例:
1
2
WHERE data->>'status' = 'running'
AND (data->>'progress')::numeric > 0.99
8. 投影(只返回需要的字段)
1
2
3
SELECT id, data->>'progress' AS progress
FROM collection
WHERE condition;
排除字段(使用排除):
1
2
SELECT * EXCEPT (password, secret_key)
FROM users;
9. 不等于
1
2
3
4
5
6
7
8
9
-- 基本不等于
WHERE status <> 'deleted'
-- 或
WHERE status != 'deleted'
-- 结合其他条件
WHERE data->>'status' <> 'completed'
AND created_at >= '2024-01-01'::timestamp;
常用速查
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
-- 查询不为空字符串
WHERE field <> '' AND field IS NOT NULL
-- 模糊查询
WHERE name LIKE '%keyword%' -- 包含
WHERE name LIKE 'prefix%' -- 开头
WHERE name LIKE '%suffix' -- 结尾
-- 正则查询
WHERE name ~* '^[a-z]+' -- 忽略大小写,以字母开头
-- 排序 + 限制
SELECT * FROM table ORDER BY created_at DESC LIMIT 10;
-- 分页
SELECT * FROM table LIMIT 10 OFFSET 20;
-- 去重
SELECT DISTINCT status FROM orders;
-- 聚合
SELECT status, COUNT(*)
FROM orders
GROUP BY status
HAVING COUNT(*) > 10;
-- 连接查询
SELECT u.name, o.order_no
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
WHERE u.status = 'active';