SQL按指定规则过滤记录、更新字段值的查询写法咨询
原有SQL错误原因
你写的SQL存在三个核心问题,导致运行结果不符合预期:
- 语法错误:
select *, from中*后多了冗余逗号,部分SQL引擎会直接抛出语法异常 - 字段名误用单引号包裹:
length('filter')是对字符串常量'filter'做长度计算,返回固定值6,永远不满足等于0的条件,因此无法命中目标记录 - 逻辑缺失:既没有保留code不等于'PK'的所有正常记录,也没有实现空filter值替换为'XXXX'的逻辑,同时空值判断漏了
NULL场景——length(NULL)返回NULL而非0,会导致filter为NULL的PK记录被错误过滤。
正确实现方案
根据两种常见使用场景给出对应SQL:
场景1:仅查询返回处理后的结果,不修改原表数据
SELECT -- 按需替换为实际业务字段即可 t.字段1, t.字段2, -- 按规则替换符合条件的filter值 CASE WHEN t.code = 'PK' AND (t.filter IS NULL OR LENGTH(t.filter) = 0) THEN 'XXXX' ELSE t.filter END AS filter, t.字段N FROM 你的表名 t -- 按规则过滤掉需要移除的记录 WHERE NOT ( t.code = 'PK' AND t.filter IS NOT NULL AND LENGTH(t.filter) > 0 );
如果使用支持EXCLUDE语法的SQL引擎(PostgreSQL、BigQuery等),可以简化写法:
SELECT t.* EXCLUDE(filter), CASE WHEN t.code = 'PK' AND (t.filter IS NULL OR LENGTH(t.filter) = 0) THEN 'XXXX' ELSE t.filter END AS filter FROM 你的表名 t WHERE NOT (t.code = 'PK' AND t.filter IS NOT NULL AND LENGTH(t.filter) > 0);
场景2:直接修改原表持久化数据
分两步顺序执行即可:
- 先更新需要替换filter值的记录
UPDATE 你的表名 SET filter = 'XXXX' WHERE code = 'PK' AND (filter IS NULL OR LENGTH(filter) = 0);
- 再删除需要移除的记录
DELETE FROM 你的表名 WHERE code = 'PK' AND filter IS NOT NULL AND LENGTH(filter) > 0;
内容的提问来源于stack exchange,提问作者Aman Thakur
相关产品推荐
相关产品推荐

