2014-09-10 227 views
1

所以我對面的一個問題來與SQL查詢(MSSQL)我一直在具有多語句的where子句,並在一個地方陳述可能或者可能不會返回一個值。如果where條件沒有滿足,我怎樣才能返回一個空值,然後返回其餘的結果?我也在使用多個CTE。SQL:where列不等於返回結果否則結果等於空白值

這是我的選擇條款:

select cte_devinfo.SerialNumber, 
    cte_devinfo.DeviceName, 
    cte_devinfo.DeviceID, 
    dev_CTE.concurrencies, 
    (cte_slots.LocationIndex +1) as 'Total Media', 
    cte_changer.SlotCount, cte_changer.TotalMountErrors, cte_changer.TotalMounts, 
    cte_mismatch.MismatchSerialNumber 
from cte_devinfo, dev_CTE, cte_slots, cte_changer, cte_mismatch 

這裏是我的where子句:

where cte_devinfo.DeviceID = dev_CTE.DeviceParentID 
and cte_slots.LocationID = dev_CTE.DeviceParentID 
and cte_changer.ChangerID = dev_CTE.DeviceParentID 
and cte_mismatch.LocationID = dev_CTE.DeviceParentID 

我想這樣的事情添加到我的where子句:

and cte_mismatch.MismatchSerialNumber != cte_devinfo.SerialNumber 

但可能永遠不會發生這種情況下,如果沒有我怎麼能忽略的條件,就回到'因此查詢的其餘部分將RU N +

+0

您可以將case語句添加到where子句中: – 2014-09-10 17:17:35

+0

cte_mismatch.MismatchSerialNumber!= cte_devinfo.SerialNumber表示您是否希望所有記錄中的cte_misvinch.SerialNumber不存在於cte_mismatch.MismatchSerialNumber中是不是正確? – 2014-09-10 17:19:29

+0

你可以做這樣的 - '和cte_mismatch.MismatchSerialNumber <> cte_devinfo.SerialNumber' – 2014-09-10 17:20:16

回答

2

首先,重寫使用ANSI查詢聯接:

select cte_devinfo.SerialNumber, 
    cte_devinfo.DeviceName, 
    cte_devinfo.DeviceID, 
    dev_CTE.concurrencies, 
    (cte_slots.LocationIndex +1) as 'Total Media', 
    cte_changer.SlotCount, cte_changer.TotalMountErrors, cte_changer.TotalMounts, 
    cte_mismatch.MismatchSerialNumber 
from cte_devinfo 
inner join dev_CTE on cte_devinfo.DeviceID = dev_CTE.DeviceParentID 
left outer join cte_slots on cte_slots.LocationID = dev_CTE.DeviceParentID 
left outer join cte_changer on cte_changer.ChangerID = dev_CTE.DeviceParentID 
left outer join cte_mismatch on cte_mismatch.LocationID = dev_CTE.DeviceParentID 

我改變了所有聯接除了第一個外,允許丟失的記錄插槽,轉換器和不匹配。 dev_CTE遺體需要,但是,因爲所有的表被連接到從它的記錄。

現在你可以添加一個where條款是這樣的:

WHERE cte_mismatch.MismatchSerialNumber IS NULL OR cte_mismatch.MismatchSerialNumber != cte_devinfo.SerialNumber 

這種情況允許在MismatchSerialNumberNULL,甚至丟失cte_mismatch記錄。

+0

如果什麼'cte_mismatch.MismatchSerialNumber'心不是零,但比較'cte_mismatch.MismatchSerialNumber!= cte_devinfo.SerialNumber'返回FLASE這樣可以防止數據/查詢的其餘部分無法顯示,因爲where語句條件返回false – jkdba 2014-09-10 18:02:10

+0

@JohnK在這種情況下,其中'cte_mismatch.MismatchSerialNumber!= cte_devinfo.SerialNumber'評估爲'FALSE'的行(即行,其中'cte_mismatch.MismatchSerialNumber'相同'cte_devinfo.SerialNumber')將被過濾掉。 – dasblinkenlight 2014-09-10 18:16:06

+0

謝謝!爲了實現我想要的結果,我將它移動到了ANSI連接中,但是不是使用您提到的where語句,而是將一個where語句添加到cte_mismatch cte,它將返回一個空值,除非比較爲'cte_mismatch.MismatchSerialNumber!= cte_devinfo.SerialNumber 「是真的。 – jkdba 2014-09-10 18:52:46