2012-12-12 101 views
0

有誰知道是否可以在一個查詢中執行以下操作而不是執行numrows?SQL Server查詢 - 組合查詢

$select1 = "SELECT service FROM UPSServices WHERE code = '$serviceCode' AND ship_from_code = '$shipFrom'"; 

$result = mssql_query($select1); 

//print_r($result); 

if(mssql_num_rows($result) == 0) { 
    $select2 = "SELECT service FROM UPSServices WHERE code = '$serviceCode' AND ship_from_code IS NULL"; 
    $result = mssql_query($select2); 
} 

while ($service = mssql_fetch_array($result)) { 
    return $service['0']; 
} 

回答

0

我認爲,如果指定shipCode不存在

SELECT service FROM UPSServices WHERE 
code = '$serviceCode' AND (ship_from_code = '$shipFrom' OR ship_from_code IS NULL) 
ORDER BY ship_from_code" 

排序將確保,如果存在,你的船代碼,然後其在頂部

+0

遺憾的是它不,即使船舶存在的代碼,這不是我想要的 – LeeTee

+0

嘗試'ORDER BY ship_from_code DESC' – Manish

+0

這是不可靠挑選一個出來這帶出了頂部的空值的服務基於命令。如果它不存在,我需要選擇帶有貨運代碼的貨物代碼,如果它沒有選擇具有NULL值的貨物代碼。順序不會這樣做。 – LeeTee

1

您正在使用需要用NULL shipCode值SQL Server,所以你可以做到這一點。它比你想象的要複雜得多。以下版本計算有效值的數量。如果這大於0,則NULL被過濾掉。

select service  
from (SELECT service, 
      count(ship_from_code) over() as NumValues 
     FROM UPSServices 
     WHERE code = '$serviceCode' AND (ship_from_code = '$shipFrom' OR ship_from_code IS NULL) 
    ) t 
where (NumValues > 0 and service is not NULL) or (NumValues = 0 and service is NULL) 
limit 1 
+0

是相當於'group by'的'over()'?換句話說,您可以使用'count(ship_from_code)作爲numvalues/group by service'獲得等效的查詢' – Beth

+0

@Beth。 。 。 over是窗口函數的一個例子(在Oracle中也稱爲分析函數)。在這種情況下,它會進行聚合以獲取計數,然後將值附加到每行,而不是將它們放在一起。 –

+0

所以結果應該是一樣的,但表現可能會有所不同?我試圖理解這兩種方法之間的差異。 – Beth