在函数中的multiple和/或T-SQL语句中从First或occurence中选择记录
我有以下SQL(示例):在函数中的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
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