文章

PgSQL语法

  1. 基本格式 JavaScript 复制 db.<集合>.find({ <条件> })

  2. 等值匹配 JavaScript 复制 { field: value } 例: JavaScript 复制 { id: “3393633870761476271” }

  3. 嵌套字段(用点号) JavaScript 复制 { “state.status”: “running” }

  4. 比较运算 JavaScript 复制 { field: { $gt: 0.99 } } // 大于 { field: { $lt: 100 } } // 小于 { field: { $in: [1, 2] } } // 在数组中

  5. 数组元素匹配 JavaScript 复制 { sku_id_list: NumberLong(“100028998016”) }

  6. 特殊类型 ObjectId:ObjectId(“…”) NumberLong:NumberLong(“123”)

  7. 组合条件 JavaScript 复制 { “state.status”: “running”, “state.progress”: { $gt: 0.99 } }

  8. 可选:投影(只返回需要的字段) JavaScript 复制 db.collection.find({…}, { id: 1, “state.progress”: 1, _id: 0 })

  9. 不等于

    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'
#>按路径取 JSONdata#>'{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
BIGINT100028998016::bigintCAST(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
ARRAYARRAY[1,2,3]'{1,2,3}'::int[]

7. 组合条件(逻辑运算)

运算符含义示例
ANDWHERE cond1 AND cond2
ORWHERE cond1 OR cond2
NOTWHERE 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';

© 2024- lfj