Sql server 如何检查该值是否存在,并根据答案返回不同的值?

Sql server 如何检查该值是否存在,并根据答案返回不同的值?,sql-server,tsql,select,case,exists,Sql Server,Tsql,Select,Case,Exists,首先让我解释一下我目前使用的查询 例如,此查询返回值“357 kg”: 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.Prod

首先让我解释一下我目前使用的查询

例如,此查询返回值“357 kg”:

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# AND POCI.Name = 'C_VIKTA'
问题是,有时POCI.Name(C_VIKTA)不存在于记录中,因此它的值(POCI.value)不会返回。 所以我想让下面的逻辑起作用,我知道它可以用一个案例来解决,而且是存在的,但我就是不想让它起作用

我想要的结果是,如果POCI.Value存在,则返回CONCAT(POCI.Value,'kg'),否则返回'N/A'。有人知道怎么解决这个问题吗

如果你还需要知道什么来帮助我,请告诉我

比尔


Mik

我建议您将
和POCI.Name='C_VIKTA'
从where子句移动到左侧连接,如下所示

SELECT TOP 1 
     case when POCI.Value is not null then CONCAT(POCI.Value,' kg') else '' end
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 AND POCI.Name = 'C_VIKTA'
WHERE 
     P.ProductId = #ProductId#

我认为最简单的方法是删除处理null的CONCAT,然后依赖is null。因此,您的单选列将是

SELECT TOP 1 ISNULL(POCI.Value+' kg','N\A')

这样,如果POCI.Value为null,则第一个参数将为null,因此返回'N\a'

This
其中POCI.Name='C_VIKTA'
中断左连接
因此,将其向上移动到左连接或使它们都是常规连接

如果它只返回一行,则删除顶部

+
的行为与concat不同

SELECT ISNULL(POCI.Value +' kg','N\A')
FROM ProductionOrder PO
JOIN Product P 
       ON P.ProductionOrderId = PO.ProductionOrderId
JOIN ProductionOrderConfiguration POC 
       ON POC.ProductionOrderConfigurationId  = PO.ProductionOrderConfigurationId 
JOIN ProductionOrderConfigurationItem POCI 
       ON POCI.ProductionOrderConfigurationId = POC.ProductionOrderConfigurationId           
WHERE POCI.Name = 'C_VIKTA' 
  AND P.ProductId = #ProductId# 
为什么需要
产品订单配置POC

SELECT ISNULL(POCI.Value +' kg','N\A')
    FROM ProductionOrder PO
    JOIN Product P 
           ON P.ProductionOrderId = PO.ProductionOrderId
    JOIN ProductionOrderConfigurationItem POCI 
           ON POCI.ProductionOrderConfigurationId = PO.ProductionOrderConfigurationId           
    WHERE POCI.Name = 'C_VIKTA' 
      AND P.ProductId = #ProductId#

当使用
Top
:)@LONG good point时,
Order by
起着重要的作用,虽然在这种情况下,可能知道它是相同的重复值,并且顺序是不相关的,但我遇到了这个问题sometimes@AnthonyHancock是 啊也许op有一个聚集索引,所以每次运行xDOrder by时结果都是一致的,这无关紧要,它只能是1条记录,前1条记录就在那里,因为它是从另一个查询复制的,但是谢谢你的提示:)@LONG你能给我指一个参考吗?这个参考解释了四个在某处有聚集索引的连接表的结果的保证顺序?我微弱的理解是,如果没有order by子句,就不能保证顺序不会随着新的索引统计数据、软件补丁、额外的处理器内核等而改变。(对于一个在测试中一直有效的故事:)正如@Stivan在他的回答中提到的,您肯定必须将名称检查移出where子句,否则当名称不匹配时,您将不会返回任何内容。谢谢Stivan,这很好地解决了问题。正是我要找的!干杯