You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL按条件扩展ID字段:特定场景下拼接后缀007的实现求助

问题:为特定ID的指定记录拼接后缀007

需要为ID字段添加后缀007,但仅当某个ID存在GRP = 3的记录时生效。此时仅修改该ID下满足GRP != 3且DAT IS NULL的行的ID,将其改为原ID拼接007的形式(例如1变为1007)。

现有数据

IDDATGRP
11003
1null1
1null1
22003
2null2
3null1
3null1

期望结果

IDDATGRP
11003
1007null1
1007null1
22003
2007null2
3null1
3null1

尝试的错误方法

之前的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
             )

该方法得到的结果:

IDDATGRPID_NEW
110031
1null18
1null18
220032
2null29

正确解决方案

需要解决两个核心问题:改用字符串拼接而非数值运算,同时保留所有记录仅对符合条件的行修改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;

关键说明

  1. 移除原SQL中的WHERE EXISTS子句,确保所有记录都被保留;
  2. 使用对应数据库的字符串拼接方法(CONCAT/+/||)替代数值相加,实现后缀拼接;
  3. 通过EXISTS子查询判断当前ID是否存在GRP=3的记录,仅对满足条件的行修改ID;
  4. 将ID转为字符串类型,避免结果中同时存在数值和字符串类型。

内容的提问来源于stack exchange,提问作者geek45

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 15:02:14