如果满足条件,SQL会执行内连接

kob*_*obe 11 sql sql-server

我想要一个改善我的SQL代码的好方法,我必须在满足条件时使用内连接.我目前正在复制代码:

@SystemMerge bit

if (@SystemMerge=1)  
BEGIN
   SELECT
         .......
      FROM myTable
      INNER JOIN table ON table.param1=myTable.param1
      INNER JOIN systemTable on systemTable.param2=myTable.param2
   END
ELSE
   BEGIN
      SELECT
         .......
      FROM myTable
      INNER JOIN table ON table.param1=myTable.param1
   END
Run Code Online (Sandbox Code Playgroud)

我想以这样的方式做到这一点:

@SystemMerge bit
BEGIN
   SELECT
      .......
   FROM myTable
   INNER JOIN table ON table.param1=myTable.param1
   ***//the next 4 lines is not working, but this pseudo of what i want:***
   if (@SystemMerge=1)  
   begin
      INNER JOIN systemTable on systemTable.param2=myTable.param2
   end
Run Code Online (Sandbox Code Playgroud)

编辑: 解决方案(感谢@Damien_The_Unbeliever):

LEFT JOIN systemTable ON systemTable.param2=myTable.param2
WHERE 
   ((@SystemMerge=1 AND systemTable.param2 is not null) 
   OR
   (@SystemMerge=0 OR @SystemMerge is null))
Run Code Online (Sandbox Code Playgroud)

Dam*_*ver 14

这应该(近似地)做同样的事情:

SELECT
     .......
  FROM myTable
  INNER JOIN table ON table.param1=myTable.param1
  LEFT JOIN systemTable on systemTable.param2=myTable.param2 and @SystemMerge = 1
  WHERE (@SystemMerge = 0 OR systemTable.NonNullableColumn IS NOT NULL)
Run Code Online (Sandbox Code Playgroud)

当然,这也意味着systemTable必须编写对其中列的任何其他引用以期望这些列NULL.


Rob*_*ert 5

动态sql呢?

declare @sel varchar(max)

set @sel = ' SELECT
         .......
         FROM myTable
         INNER JOIN table ON table.param1=myTable.param1
        '

 if (@SystemMerge=1)  
   begin
     set @sel = @sel+'INNER JOIN systemTable on systemTable.param2=myTable.param2'
   end

exec(@sel)
Run Code Online (Sandbox Code Playgroud)