为列批量赋值时,如何更简洁编写SQL的CASE WHEN语句?
更简洁的方式填充fledgling列数据
我给数据表新增了名为fledgling的列,现在需要为该列填充数据。现有数据表结构及数据如下:
| ID | birdname | height | wingspan | eggs | broods | incubation | fledgling | nestbuilder |
|---|---|---|---|---|---|---|---|---|
| 1 | Great Blue Heron | 52 | 78 | 5 | 1 | 28 | NULL | B |
| 2 | Mallard | 28 | 3 | 10 | 1 | 30 | NULL | F |
| 3 | Common Loon | 36 | 54 | 2 | 1 | 31 | NULL | B |
| 4 | Bald Eagle | 37 | 84 | 2 | 1 | 36 | NULL | B |
| 5 | Golden Eagle | 40 | 90 | 3 | 1 | 45 | NULL | B |
| 6 | Red Tailed Hawk | 25 | 48 | 3 | 1 | 35 | NULL | B |
| 7 | Osprey | 24 | 72 | 4 | 1 | 42 | NULL | B |
我当前编写的SQL代码类似以下形式(仅展示部分逻辑):
SET BIRDS.incubation = (case when bird_id = 1 then 60 when bird_id = 2 OR bird_id = 11 then 52 when bird_id = 3 OR bird_id = 5 OR bird_id = 15 then 80 when bird_id = 4 then 90 when bird_id = 6 then 46 when bird_id = 7 then 58 when bird_id = 8 OR bird_id = 10 then 24 when bird_id = 9 then 55 ...
请问有没有更简洁的方式来填充fledgling列数据?
可以采用UPDATE结合VALUES行构造器的写法,比嵌套CASE WHEN更直观,维护也更方便,尤其适合批量匹配ID和对应值的场景:
示例代码(MySQL环境):
UPDATE BIRDS b JOIN ( VALUES (1, 60), (2, 52), (3, 80), (4, 90), (5, 80), (6, 46), (7, 58), (8, 24), (9, 55), (10, 24), (11, 52), (15, 80) ) AS temp (bird_id, fledgling_val) ON b.ID = temp.bird_id SET b.fledgling = temp.fledgling_val;
不同数据库适配调整:
- PostgreSQL:需将VALUES子句嵌套在SELECT中:
UPDATE BIRDS b SET fledgling = temp.fledgling_val FROM ( SELECT * FROM (VALUES (1, 60), (2, 52), ... ) AS temp(bird_id, fledgling_val) ) temp WHERE b.ID = temp.bird_id; - SQL Server:使用表值构造器关联更新:
UPDATE b SET b.fledgling = temp.fledgling_val FROM BIRDS b INNER JOIN ( VALUES (1, 60), (2, 52), ... ) AS temp(bird_id, fledgling_val) ON b.ID = temp.bird_id;
这种写法的优势:
- 结构清晰,ID与对应值一一对应,新增或修改条目只需在VALUES中添加/调整行即可
- 避免冗长的CASE WHEN嵌套,可读性和可维护性大幅提升
- 执行效率与CASE WHEN相当,但逻辑更直观
内容的提问来源于stack exchange,提问作者Christopher Martinez
相关产品推荐
相关产品推荐

