2013-10-09 147 views
0

我有以下SQL(例如):选择记录

SET @Return_Value = = (SELECT Top 1 
          (CASE WHEN .... THEN ColumValue1 ELSE ColumValue2 END) 
         FROM TableA WHERE (Lots of AND Statements) 
         AND 
          (
          (bla1) 
          OR 
          (bla2) 
          OR 
          (bla3) 
         ) 

的BLA1等都是逻辑检索表A科拉姆值。如果在执行bla2或bla3时发现它们,我怎么能返回bla1中的值,因为这些值可能会覆盖我正在寻找的内容?换句话说,如果前一个没有找到数据,我只想执行OR语句,所有这些都在函数中。

+0

我理解正确吗?你想用一些添加剂来标记你的结果,所以你可以看到这些结果,因为它们被发现了哪些'where''子句? – DrCopyPaste

+0

你的例子很含糊,但也许你可以使用coalesce? http://msdn.microsoft.com/en-us/library/ms190349.aspx – Andrew

+0

实际上,我只想返回第一个OR语句中的数据(如果找到),无论哪个OR语句碰巧是 – TuSabesTuSabes

回答

0

您可以使用CASE表达式为:

SET @Return_Value = (SELECT Top 1 
          (CASE WHEN .... THEN ColumValue1 ELSE ColumValue2 END) 
         FROM TableA WHERE (Lots of AND Statements) 
         AND 
          (1 = case when condition1 then 1 
           case when condition2 then 1 
           case when condition3 then 1 
           end 
         ); 
0

你可以使用order by,像

select Top 1 
    CASE WHEN .... THEN ColumValue1 ELSE ColumValue2 END 
FROM TableA 
WHERE 
    (Lots of AND Statements) AND 
    (
     (bla1) OR 
     (bla2) OR 
     (bla3) 
    ) 
order by 
    case 
     when (bla1) then 1 
     when (bla2) then 2 
     when (bla3) then 3 
     else 999 
    end 

或者你可以尝试简化它(但你必须检查的性能):

select Top 1 
    CASE WHEN .... THEN ColumValue1 ELSE ColumValue2 END 
FROM TableA 
    outer apply (
     select 
      case 
       when (bla1) then 1 
       when (bla2) then 2 
       when (bla3) then 3 
      end as T 
    ) as C 
WHERE 
    (Lots of AND Statements) and 
    C.T is not null 
order by C.T 

或者,例如,您可以使用union,如下所示:

with cte as (
    select Top 1 
     CASE WHEN .... THEN ColumValue1 ELSE ColumValue2 END as data 
    FROM TableA 
    WHERE 
     (Lots of AND Statements) 
), cte2 as (
    select top 1 data, 1 as c from cte where (bla1) 
    union all 
    select top 1 data, 2 as c from cte where (bla2) 
    union all 
    select top 1 data, 3 as c from cte where (bla3) 
) 
select top 1 data 
from cte2 
order by c