如何在SELECT查询中为指定city和code行的Temp临时列赋值?
为特定行的Temp列赋值指定文本的最优实现方案
方案一:使用CASE WHEN(通用标准写法)
这是所有SQL数据库都支持的标准实现方式,逻辑清晰、性能优异,适合匹配规则较少的场景。
修改后的查询语句如下:
SELECT DISTINCT city, code, CASE WHEN city = 'bang' AND code = 'codeb' THEN 'ex' WHEN city = 'afghan' AND code = 'coded' THEN 'ab' WHEN city = 'afghan' AND code = 'codee' THEN 'cbhk' ELSE '' -- 其余行返回空字符串,若要保留原查询的空格则写' ' END AS Temp FROM table t1 WHERE value = 'notequal'
逻辑说明:
- 通过
CASE语句逐一匹配city和code的目标组合,匹配成功则返回指定文本值 - 未匹配到的行,
ELSE部分返回空字符串(如果需要和原查询一致返回空格,把''改成' '即可) - 保留原查询的
DISTINCT和WHERE条件,确保输出结果的过滤规则不变
方案二:JOIN临时数据集(适合规则较多的场景)
如果后续需要添加更多匹配规则,维护大量CASE WHEN会比较繁琐,这时可以通过JOIN临时规则数据集的方式,降低维护成本:
SELECT DISTINCT t1.city, t1.code, COALESCE(r.temp_value, '') AS Temp FROM table t1 LEFT JOIN ( -- 这里存放所有需要赋值的规则 SELECT 'bang' AS city, 'codeb' AS code, 'ex' AS temp_value UNION ALL SELECT 'afghan' AS city, 'coded' AS code, 'ab' AS temp_value UNION ALL SELECT 'afghan' AS city, 'codee' AS code, 'cbhk' AS temp_value ) r ON t1.city = r.city AND t1.code = r.code WHERE t1.value = 'notequal'
逻辑说明:
- 用子查询构建临时规则表,包含需要匹配的
city、code和对应的temp_value - 通过
LEFT JOIN关联原表与规则表,匹配成功的行取规则表的temp_value - 用
COALESCE处理未匹配的行,返回空字符串(同样可改成' ') - 后续新增规则只需在子查询中添加
UNION ALL语句,无需修改主逻辑
方案选择建议:
- 若匹配规则仅几条,优先选方案一,代码更简洁,执行效率更高
- 若规则较多或需频繁调整,优先选方案二,维护成本更低
内容的提问来源于stack exchange,提问作者vid
相关产品推荐
相关产品推荐

