2012-03-23 79 views
0

我有一个很长的存储过程,我想对过程进行一些细微的修改而不必创建一个新的(用于维护目的)。是否有可能在sql语句中使用IF或CASE

是否可以在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

你可以在一个语句中使用'CASE',因为它是一个表达式导致一个值。可能会被强迫让一个'OUTER JOIN'以各种方式表现出来。使用简单的'IF'来调用两个'SELECT INTO'语句中的一个,然后在存储过程的余额中使用生成的临时表可能会更好。 – HABO 2012-03-23 16:20:40

+0

'CASE'语句可以返回**值**作为比较或条件 - 但它不能**返回要执行的SQL的片段。 – 2012-03-23 16:58:52

回答

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柱空。

如果两个连接都是内部的,它将不起作用。

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 
+0

我正在运行多个水晶报告,因为我具有相同的基本数据除了一个需要在存储过程结束时加入多个表的报表之外。我目前有2个sp,其中一个用于报告特殊情况,但我希望只有一个变量参数sp。我将再次查看代码以查看是否还有其他选项。 – Eric 2012-03-23 16:37:36

+0

这可能是我会做的,因为我不想在这种情况下使用动态sql。 – Eric 2012-03-23 16:44:22

3

不,这是不可能的。你只能通过使用动态SQL来实现这一点。

The Curse and Blessings of Dynamic SQL

An Intro to Dynamic SQL

我不会建议使用动态SQL,也最有可能更好的方法来执行此操作,但你必须提供更多的信息。

+0

我也会看看这个。 – Eric 2012-03-23 16:39:04

+0

我想将尝试在我的连接中处理这个问题,并只返回我需要的内容。如果两个结果都非常不同,我将使用单独的sp。谢谢 – Eric 2012-03-23 16:46:44

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 
0

您还没有透露您的条款SELECT条款。你想要什么本质是如下:

SELECT indexed 
    FROM tableA 
INTERSECT 
SELECT indexed 
    FROM tableB 
INTERSECT 
SELECT indexed 
    FROM tableC 
WHERE @Param = 'Y' 

然后用这个表表达式由您SELECT条款规定如说你只想投影表A:

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); 
相关问题