如何判断值是否存在并根据查询结果返回不同值?
解决方案:根据查询结果存在性返回不同值
我明白你的需求了——你现在有一个查询会返回类似 357 kg 的字符串,但需要判断这个结果是否存在(也就是原查询有没有匹配到记录),然后根据判断返回对应的结果。下面给你几个实用的SQL实现方案:
方案1:使用CASE + EXISTS(直观易懂)
这个方案先检查是否存在符合条件的记录,再决定返回原查询结果还是默认值:
SELECT CASE -- 先判断是否存在匹配的记录 WHEN EXISTS ( SELECT 1 FROM ProductionOrder PO LEFT JOIN Product P ON P.ProductionOrderId = PO.ProductionOrderId LEFT JOIN ProductionOrderConfiguration POC ON POC.ProductionOrderConfigurationId = PO.ProductionOrderConfigurationId LEFT JOIN ProductionOrderConfigurationItem POCI ON POCI.ProductionOrderConfigurationId = POC.ProductionOrderConfigurationId WHERE P.ProductId = #ProductId# -- 替换为你的实际参数 ) THEN ( -- 存在则执行原查询返回拼接后的重量值 SELECT TOP 1 CONCAT(POCI.Value,' kg') FROM ProductionOrder PO LEFT JOIN Product P ON P.ProductionOrderId = PO.ProductionOrderId LEFT JOIN ProductionOrderConfiguration POC ON POC.ProductionOrderConfigurationId = PO.ProductionOrderConfigurationId LEFT JOIN ProductionOrderConfigurationItem POCI ON POCI.ProductionOrderConfigurationId = POC.ProductionOrderConfigurationId WHERE P.ProductId = #ProductId# ) -- 不存在则返回你指定的默认值,比如'N/A'或者空字符串 ELSE 'N/A' END AS WeightResult
方案2:使用CTE + COALESCE(避免重复查询,性能更优)
如果担心重复执行两次原查询影响性能,可以用公共表表达式(CTE)先获取结果,再处理空值场景:
-- 先通过CTE获取可能的重量结果 WITH WeightCTE AS ( SELECT TOP 1 CONCAT(POCI.Value,' kg') AS WeightValue FROM ProductionOrder PO LEFT JOIN Product P ON P.ProductionOrderId = PO.ProductionOrderId LEFT JOIN ProductionOrderConfiguration POC ON POC.ProductionOrderConfigurationId = PO.ProductionOrderConfigurationId LEFT JOIN ProductionOrderConfigurationItem POCI ON POCI.ProductionOrderConfigurationId = POC.ProductionOrderConfigurationId WHERE P.ProductId = #ProductId# ) -- 处理两种情况:CTE有结果则返回,无结果则返回默认值 SELECT COALESCE(WeightValue, 'N/A') AS WeightResult FROM WeightCTE UNION ALL SELECT 'N/A' AS WeightResult WHERE NOT EXISTS (SELECT 1 FROM WeightCTE)
小提示
- 你可以把
'N/A'替换成任何你需要的默认值,比如空字符串''或者'无数据'。 - 如果你的原查询中
LEFT JOIN其实应该是INNER JOIN(比如只有关联到Product的ProductionOrder才需要统计),可以调整JOIN类型让结果更准确。
内容的提问来源于stack exchange,提问作者Mikael
相关产品推荐
相关产品推荐

