2016-01-27 95 views
0

我想在表中的某个字段不为空时从表中选择特定的列。SQL - 案例中的Select语句

换句话说,我有两个表,它们具有共同的字段,所以当表1中字段名为“salesordrkey”的字符不为空时,我需要从表2中获取公共字段,否则从表中获取公共字段1号

这里就是我想要做什么

Select slsordr.salesordrkey, 
     whissue.warehissuekey, 
     issuppk.issueprodpackkey, 
     (Case When whissue.salesordrkey Is Not Null Then 
      (Select slsordr.busipartnerkey, 
        slsordr.contractkey, 
        slsordr.salesmankey, 
        slsordr.customerkey) 
     Else 
      (Select whissue.busipartnerkey, 
        whissue.contractkey, 
        whissue.salesmankey, 
        slsordr.customerkey) 
     End) 
From warehissues whissue 
    Inner Join issueprodpacks issuppk on whissue.warehissuekey = issuppk.warehissuekey 
    Left Join slssalesordrs slsordr on whissue.salesordrkey = slsordr.salesordrkey 
Where 
     whissue.partitionkey = @prtnkey and 
     issuppk.prodpackkey = @prodpackkey 

但这并没有工作..是否有任何其他的方式来实现这一目标?

+0

你可能会更好地分享表结构以及问题。鉴于问题中的内容,您是否考虑过使用其他连接以及条件? – danish

+1

首先,当你声明一个SELECT时,你必须声明从哪里选择FROM。其次,你可以选择4列成一个,你必须为每一个情况。最后,你已经加入了桌子,所以第二张桌子上的信息是可以访问的,你不必再次选择任何东西,只是使用你得到的信息。 – sagi

+0

一个case表达式返回一个简单的值,你试着返回4个值。 – jarlh

回答

2

我假设你的逻辑是倒退的。相反的:

case when whissue.salesordrkey is not null . . . 

我想你打算:

case when slsordr.salesordrkey is not null 

先不检查,看看是否left join工作。

所以,你可以使用coalesce()

select slsordr.salesordrkey, whissue.warehissuekey, issuppk.issueprodpackkey, 
     coalesce(slsordr.busipartnerkey, whissue.busipartnerkey) as busipartnerkey, 
     coalesce(slsordr.contractkey, whissue.contractkey) as contractkey, 
     coalesce(slsordr.salesmankey, whissue.salesmankey), 
     coalesce(slsordr.customerkey, whissue.customerkey) 
from warehissues whissue inner join 
    issueprodpacks issuppk 
    on whissue.warehissuekey = issuppk.warehissuekey left join 
    slssalesordrs slsordr 
    on whissue.salesordrkey = slsordr.salesordrkey 
where whissue.partitionkey = @prtnkey and 
     issuppk.prodpackkey = @prodpackkey 

我要指出,这是不是100%完全一样的逻辑。一些匹配的记录可能在slsordr表中有NULL值。然后使用coalesce()将带来另一个表中的值,即使有匹配。但是,这往往是逻辑。

否则,您需要使用多个case声明:

 (case when slsorderkey is not null then slsordr.busipartnerkey 
      else whissue.busipartnerkey 
     end) as busipartnerkey, 

case是一个表达式。它只返回一个值,而不是多个值。

+0

这会做到这一点,但我认为你还应该包括一个解释,因为他的代码有一个以上的错误,并告诉他他做错了什么。 – sagi

+0

不,我不打算,因为salesordrkey是slsordr表中的主键。 谢谢你的回答,它的确帮助了我。 – MNada