我有一个很长的存储过程,我想对程序稍作修改而不必创建新程序(出于维护目的)。
是否可以在select语句的FROM语句中使用IF或CASE来加入其他表?
像这样:
from tableA a
join tableB b a.indexed = c.indexed
IF @Param='Y'
BEGIN
join tableC c a.indexed = c.indexed
END
它似乎对我不起作用。但我想知道这是否可能和/或这是否有意义。
感谢。
答案 0 :(得分:3)
不,这是不可能的。您只能通过使用动态SQL来实现此目的。
The Curse and Blessings of Dynamic SQL
我不建议使用动态SQL,有可能更好的方法来执行此操作,但您必须提供更多信息。
答案 1 :(得分:0)
不,这是不可能的。您最好的选择可能是从两个表中选择并仅包含您关注的数据。如果你提供一个你想要做的事情的例子,我可以提供更好的答案。
尝试一个例子:
SELECT t1.id, COALESCE(t2.name, t3.name)
FROM Table1 as t1
LEFT JOIN Table2 as t2
ON t1.id = t2.id
LEFT JOIN Table2 as t3
ON t1.id = t3.id
答案 2 :(得分:0)
虽然您提出的建议是不可能的,但您可以在适用的条件下进行游戏:
from tableA a
inner join tableB b ON a.indexed = c.indexed
left join tableC c ON a.indexed = c.indexed AND 1 = CASE @Param WHEN 'Y' THEN 1 ELSE 0 END
更高效的是做一个大的
IF @Param='Y' THEN
from tableA a
inner join tableB b ON a.indexed = c.indexed
ELSE
from tableA a
inner join tableB b ON a.indexed = c.indexed
left join tableC c ON a.indexed = c.indexed
答案 3 :(得分:0)
如果你有一个左外连接
,你可以实现类似的东西考虑
declare @param bit = 1
select a.*, b.*, c.* from a
inner join b on a.id = b.a_id
left outer join c on b.id = c.b_id and @param = 1
这将返回a,b,c。
中的所有列现在尝试
declare @param bit = 0
这将返回a和b中的所有列,并返回c。
列的空值如果两个连接都在内部,它将无效。
答案 4 :(得分:0)
您尚未透露SELECT
条款。你想要的本质如下:
SELECT indexed
FROM tableA
INTERSECT
SELECT indexed
FROM tableB
INTERSECT
SELECT indexed
FROM tableC
WHERE @Param = 'Y'
然后按照SELECT
子句的规定使用此表格表达式,例如说你只想投射tableA:
WITH T
AS
(
SELECT indexed
FROM tableA
INTERSECT
SELECT indexed
FROM tableB
INTERSECT
SELECT indexed
FROM tableC
WHERE @Param = 'Y'
)
SELECT *
FROM tableA
WHERE indexed IN ( SELECT indexed FROM T );