是否可以在sql FROM语句中使用IF或CASE

时间:2012-03-23 16:11:49

标签: sql sql-server-2005

我有一个很长的存储过程,我想对程序稍作修改而不必创建新程序(出于维护目的)。

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

它似乎对我不起作用。但我想知道这是否可能和/或这是否有意义。

感谢。

5 个答案:

答案 0 :(得分:3)

不,这是不可能的。您只能通过使用动态SQL来实现此目的。

The Curse and Blessings of Dynamic SQL

An Intro to 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 );