只有当参数@param不为null或者它具有特定值时,我才需要与表B进行连接。
我不想添加IF / ELSE,因为商店对此非常重要。
我的商店返回超过50个参数,并与10个表连接。
如果声明的@param条件满足,我只想跳过其中一个连接。
我希望有人可以帮助我。 提前谢谢!
更新
DECLARE @param INT = NULL;
SELECT
/* HERE GOES A LOOT OF PARAMETERS */
FROM
T0 T
INNER JOIN T1 B ON T.attr1 = B.attr1
LEFT JOIN T2 TFD ON T.attr2 = TFD.attr2
LEFT JOIN T3 TTT ON (TTT.attr3 = TFD.attr3)
INNER JOIN T4 U ON B.attr4 = U.attr5 AND U.attr6 = @attr6
-- The following commented section is the one that i want to skip if @param is NULL
/*LEFT JOIN @tvp P ON (
(P.attr11= TFD.attr9 AND T.attr8 = P.attr8 AND P.attr7 = 1) OR
(P.attr11 = TFD.attr9 AND T.attr8 = P.attr8 AND P.attr7 = 0 AND B.attr4 = @attr5) OR
(TFD.attr9 IS NULL AND P.attr8 = T.attr8)
)*/
LEFT JOIN T4 FTB ON FTB.attr1 = B.attr1
LEFT JOIN T6 S ON S.attr10 = T.attr10
LEFT JOIN @splittedElementsIds SETI ON SETI.item = T.attr9
WHERE
(@attr9 IS NULL OR T.attr9 = SETI.item)
GROUP BY
/* LOOTS OF GROUP BY PARAMETERS */
答案 0 :(得分:2)
在ON子句中使用@param条件,这是一个例子:
select * from A
left join B on A.id = B.id and @param1 = 'X'
left join C on A.id = C.id and @param2 = 'Y'
etc...
答案 1 :(得分:0)
有不同的解决方案:
1 - 您可以通过查询字符串并通过sp_executesql运行它来动态创建sql语句
2 - 使用Union all
如下
假设t2
是您有条件加入的表格,@param
是您想要根据
;With query as
(Select * from t1
inner join t3
inner join t3)
Select * from query
Where @param = 1
union all
Select * from query
inner join t2
Where @param = 2
答案 2 :(得分:0)
SQL查询返回一组固定的列。有问题的join
- 因为它是可选 - 似乎不会返回查询中的任何列。因此,我认为它仅用于过滤。
如果是这样,我建议改为使用exists
:
select . . .
from . . .
where @param <> 'true' or exists (select 1 from b where b.? = x.?)