在函数中的multiple和/或T-SQL语句中从First或occurence中选择记录

在函数中的multiple和/或T-SQL语句中从First或occurence中选择记录,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有以下SQL(示例): bla1等是从表A检索列值的逻辑。如果在没有执行bla2或bla3的情况下找到bla1中的值,我如何从中返回这些值,因为这些值可能会覆盖我要查找的内容?换句话说,如果前一个语句没有找到数据,我只想执行OR语句,所有这些都在一个函数中。您可以使用case表达式: SET @Return_Value = (SELECT Top 1 (CASE WHEN .... THEN ColumValue1 ELSE ColumVal

我有以下SQL(示例):


bla1等是从表A检索列值的逻辑。如果在没有执行bla2或bla3的情况下找到bla1中的值,我如何从中返回这些值,因为这些值可能会覆盖我要查找的内容?换句话说,如果前一个语句没有找到数据,我只想执行OR语句,所有这些都在一个函数中。

您可以使用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
                          );

您可以使用按排序,如

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
或者您可以尝试简化它(但您必须检查性能):

或者,例如,您可以使用
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

我理解正确吗?你想用一些加法标记你的结果,这样你就可以在这些结果中看到它们是由于哪个
where
-子句找到的?你的例子很模糊,但也许你可以使用coalesce?事实上不,我只想返回第一个或语句中的数据(如果找到),无论哪个或语句发生在beDeepshikha身上,我真的很喜欢你的解决方案并尝试过,但记录是从多个case语句中返回的,奇怪,不知道为什么。Roman Pekar,我还没有尝试过你的解决方案,不知道如何将它与我的解决方案相匹配,谢谢。
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
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