LEFT JOIN,包含案例条件

时间:2017-11-01 18:50:03

标签: sql sql-server stored-procedures left-join case

我有一个存储过程,它将@Table1.ColumnName(列的名称)作为输入参数。这是存储过程中的查询:

select data
from Table1               
    case @Table1.ColumnName = 'Table1.column1'  
       THEN LEFT JOIN Table2  (on Table1.column1 = Table2.column1)

   case @Table1.ColumnName = 'Table1.column2' 
       THEN LEFT JOIN Table2 
             (on Table1.column2 = Table2.column1)

我需要通过检查输入参数@Table1.ColumnName在存储过程中进行左连接。我需要改变连接中的ON条件。

我不确定语法。任何人都可以帮我写一个带有大小写条件的左连接。

4 个答案:

答案 0 :(得分:2)

由于@ table1.column1变量不匹配,所以你不能做两个左连接,你知道你只会在其中一个中获得结果。并且您始终可以合并结果,以便从t2,t3获得非空值(下面的col1示例)

ssh

否则我相信你必须使用动态SQL来完成你所追求的目标。

或者我想你可以将结果空白结果......

SELECT t1.*, coalesce(t1.column1, t2.column1) as Col1
FROM  Table1 t1
LEFT JOIN table2 t2 
  on T1.column1 = t2.column1 
 and @table1.column1 = 'Table1.column1'
LEFT JOIN table3 t3 
  on T1.column2 = t3.column1 
 and @table1.column2 = 'Table1.column2'

答案 1 :(得分:2)

您可以使用动态sql:

declare @sql nvarchar(max);

set @sql = '
  select data
  from Table1
    left join Table2 
      on Table2.column1 = ';
if @Table1.ColumnName = 'Table1.column1'
begin;
  set @sql = @sql + 'Table1.column1';
end;
if @Table1.ColumnName = 'Table1.column2'
begin;
  set @sql = @sql + 'Table1.column2';
end;

exec sp_executesql @sql;

参考:

答案 2 :(得分:0)

您可以尝试这样的事情。

SELECT data
FROM Table1               
LEFT JOIN Table2 ON
  @Table1.ColumnName = 'Table1.column1'  
  AND Table1.column1 = Table2.column1
LEFT JOIN Table2 ON
  @Table1.ColumnName = 'Table1.column2' 
  AND Table1.column2 = Table2.column1

答案 3 :(得分:0)

根据参数@ColName尝试此代码,您将使用不同的连接条件

declare @ColName int = 'FieldNameHere'
select *
from Table1
    left join Table2
        on (Table1.column1 = Table2.column1 and @ColName = 'FieldNameHere')
            or (Table1.column2 = Table2.column2 and @ColName <> 'FieldNameHere')