2012-12-12 74 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