SQL按条件扩展ID字段:特定场景下拼接后缀007的实现求助
问题:为特定ID的指定记录拼接后缀
007 需要为ID字段添加后缀007,但仅当某个ID存在GRP = 3的记录时生效。此时仅修改该ID下满足GRP != 3且DAT IS NULL的行的ID,将其改为原ID拼接007的形式(例如1变为1007)。
现有数据
| ID | DAT | GRP |
|---|---|---|
| 1 | 100 | 3 |
| 1 | null | 1 |
| 1 | null | 1 |
| 2 | 200 | 3 |
| 2 | null | 2 |
| 3 | null | 1 |
| 3 | null | 1 |
期望结果
| ID | DAT | GRP |
|---|---|---|
| 1 | 100 | 3 |
| 1007 | null | 1 |
| 1007 | null | 1 |
| 2 | 200 | 3 |
| 2007 | null | 2 |
| 3 | null | 1 |
| 3 | null | 1 |
尝试的错误方法
之前的SQL仅实现了数值相加,导致ID 1变为8而非1007,还因WHERE EXISTS子句丢失了ID 3的记录:
SELECT *, CASE WHEN DAT IS NULL AND GRP != 3 THEN ID + 007 ELSE ID END AS ID_NEW FROM table1 t1 WHERE EXISTS (SELECT 1 FROM table1 t2 WHERE t1.ID = t2.ID AND GRP = 3 )
该方法得到的结果:
| ID | DAT | GRP | ID_NEW |
|---|---|---|---|
| 1 | 100 | 3 | 1 |
| 1 | null | 1 | 8 |
| 1 | null | 1 | 8 |
| 2 | 200 | 3 | 2 |
| 2 | null | 2 | 9 |
正确解决方案
需要解决两个核心问题:改用字符串拼接而非数值运算,同时保留所有记录仅对符合条件的行修改ID。以下是不同数据库的实现方式:
MySQL 版本
SELECT CASE WHEN EXISTS (SELECT 1 FROM table1 t2 WHERE t2.ID = t1.ID AND t2.GRP = 3) AND t1.DAT IS NULL AND t1.GRP != 3 THEN CONCAT(t1.ID, '007') ELSE CAST(t1.ID AS CHAR) END AS ID, t1.DAT, t1.GRP FROM table1 t1;
SQL Server 版本
SELECT CASE WHEN EXISTS (SELECT 1 FROM table1 t2 WHERE t2.ID = t1.ID AND t2.GRP = 3) AND t1.DAT IS NULL AND t1.GRP != 3 THEN CAST(t1.ID AS VARCHAR) + '007' ELSE CAST(t1.ID AS VARCHAR) END AS ID, t1.DAT, t1.GRP FROM table1 t1;
PostgreSQL 版本
SELECT CASE WHEN EXISTS (SELECT 1 FROM table1 t2 WHERE t2.ID = t1.ID AND t2.GRP = 3) AND t1.DAT IS NULL AND t1.GRP != 3 THEN t1.ID::TEXT || '007' ELSE t1.ID::TEXT END AS ID, t1.DAT, t1.GRP FROM table1 t1;
关键说明
- 移除原SQL中的
WHERE EXISTS子句,确保所有记录都被保留; - 使用对应数据库的字符串拼接方法(
CONCAT/+/||)替代数值相加,实现后缀拼接; - 通过
EXISTS子查询判断当前ID是否存在GRP=3的记录,仅对满足条件的行修改ID; - 将ID转为字符串类型,避免结果中同时存在数值和字符串类型。
内容的提问来源于stack exchange,提问作者geek45
相关产品推荐
相关产品推荐

