2016-01-27 45 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