SQL中如何根据OP_NO列移除NEXT_OP_NO列中的指定字符串?
移除NEXT_OP_NO列中的指定值'130'
假设你的NEXT_OP_NO列是逗号分隔的数字字符串(比如'120,130,140'或'130,150'),以下两种方法可以精准移除其中的'130',同时避免处理后出现多余分隔符:
方法1:嵌套REPLACE处理(兼容多数SQL版本)
通过多层替换处理不同位置的'130',再清理首尾多余逗号:
UPDATE 你的数据表名 SET NEXT_OP_NO = CASE -- 单独的'130'直接设为空 WHEN NEXT_OP_NO = '130' THEN '' ELSE TRIM(',' FROM REPLACE( REPLACE(NEXT_OP_NO, ',130,', ','), '130,', '' ) ) END WHERE CHARINDEX('130', NEXT_OP_NO) > 0;
逻辑说明:
- 先用
REPLACE(NEXT_OP_NO, ',130,', ',')处理中间的',130,',替换为单个逗号,避免出现连续逗号 - 再用
REPLACE(..., '130,', '')处理开头的'130,' - 最后用
TRIM(',' FROM ...)去掉首尾残留的逗号 - 单独的
'130'直接置为空字符串
方法2:拆分-过滤-聚合(SQL Server 2017+推荐)
这种方法更稳妥,适合复杂的字符串场景:
UPDATE t SET NEXT_OP_NO = agg.new_value FROM 你的数据表名 t CROSS APPLY ( SELECT STRING_AGG(value, ',') AS new_value FROM STRING_SPLIT(t.NEXT_OP_NO, ',') WHERE value <> '130' ) agg WHERE CHARINDEX('130', t.NEXT_OP_NO) > 0;
逻辑说明:
- 用
STRING_SPLIT把NEXT_OP_NO按逗号拆分成独立行 - 过滤掉等于
'130'的行 - 用
STRING_AGG将剩余值重新拼接为逗号分隔的字符串 - 自动处理所有位置的
'130',不会产生多余分隔符
测试建议
执行更新前,先通过SELECT语句验证处理结果:
-- 方法1测试 SELECT NEXT_OP_NO AS 原值, CASE WHEN NEXT_OP_NO = '130' THEN '' ELSE TRIM(',' FROM REPLACE(REPLACE(NEXT_OP_NO, ',130,', ','), '130,', '')) END AS 处理后值 FROM 你的数据表名 WHERE CHARINDEX('130', NEXT_OP_NO) > 0; -- 方法2测试 SELECT t.NEXT_OP_NO AS 原值, agg.new_value AS 处理后值 FROM 你的数据表名 t CROSS APPLY ( SELECT STRING_AGG(value, ',') AS new_value FROM STRING_SPLIT(t.NEXT_OP_NO, ',') WHERE value <> '130' ) agg WHERE CHARINDEX('130', t.NEXT_OP_NO) > 0;
内容的提问来源于stack exchange,提问作者Armando Rui Guimarães
相关产品推荐
相关产品推荐

