如何编写SQL查询:字段为空(非NULL)时依次选取备选字段
解决SQL中空字符串优先取值的方案
针对你需要优先选取非空字符串字段的需求,不能直接用COALESCE(它仅处理NULL值),可以用CASE表达式来显式判断字段是否为空字符串(或空白字符),实现优先级取值逻辑。
通用解决方案(适用于大多数数据库)
使用CASE结合TRIM(处理可能的空格空白)来判断字段是否有效:
SELECT CASE WHEN TRIM(R23VENAD-PLT-ADDR-2) <> '' THEN R23VENAD-PLT-ADDR-2 WHEN TRIM(R23VENAD-PLT-ADDR-3) <> '' THEN R23VENAD-PLT-ADDR-3 ELSE WMS-VENDOR-ADDRESS-L2 END AS preferred_address FROM your_table_name;
逻辑说明
TRIM(字段) <> '':先去除字段前后的空格,再判断是否不等于空字符串,确保排除纯空格的无效值- 按优先级依次判断,第一个满足条件的字段会被选中
- 如果前两个字段都为空/纯空格,最终返回
WMS-VENDOR-ADDRESS-L2
部分数据库的简化写法
如果你使用特定数据库,也可以用对应函数简化:
- MySQL/MariaDB:用
IF函数嵌套SELECT IF(TRIM(R23VENAD-PLT-ADDR-2) <> '', R23VENAD-PLT-ADDR-2, IF(TRIM(R23VENAD-PLT-ADDR-3) <> '', R23VENAD-PLT-ADDR-3, WMS-VENDOR-ADDRESS-L2)) AS preferred_address FROM your_table_name; - Oracle:用
NVL2结合TRIMSELECT NVL2(TRIM(R23VENAD-PLT-ADDR-2), R23VENAD-PLT-ADDR-2, NVL2(TRIM(R23VENAD-PLT-ADDR-3), R23VENAD-PLT-ADDR-3, WMS-VENDOR-ADDRESS-L2)) AS preferred_address FROM your_table_name;
注意:如果你的业务中不需要处理纯空格的情况,可以去掉TRIM,直接判断字段 <> ''即可。
内容的提问来源于stack exchange,提问作者Alfredo Huerta
相关产品推荐
相关产品推荐

