Sql 使用Case语句有条件地修改联接数
我正在编写一个使用动态sql的存储过程。如果用户组为“Initial”,我希望能够有条件地添加第一个连接条件。下面不是实际的代码,它只是显示我的问题Sql 使用Case语句有条件地修改联接数,sql,dynamic,Sql,Dynamic,我正在编写一个使用动态sql的存储过程。如果用户组为“Initial”,我希望能够有条件地添加第一个连接条件。下面不是实际的代码,它只是显示我的问题 SELECT A FROM MyTable IF UserGroup <> 'Initial THEN INNER JOIN Table1 ON MyTable.A = Table1.A END INNER JOIN Table1 ON MyTable.B = Table1.B INNER JOIN Ta
SELECT A FROM MyTable
IF UserGroup <> 'Initial THEN
INNER JOIN Table1 ON MyTable.A = Table1.A
END
INNER JOIN Table1 ON MyTable.B = Table1.B
INNER JOIN Table1 ON MyTable.C = Table1.C
下面是如何使用外部联接获得相同结果的示例:
SELECT A
FROM MyTable
LEFT JOIN Table1 T1
ON (UserGroup <> 'Initial' AND MyTable.A = T1.A)
INNER JOIN Table1 T2 ON MyTable.B = T2.B
INNER JOIN Table1 T3 ON MyTable.C = T3.C
WHERE (UserGroup <> 'Initial' AND T1.A IS NOT NULL) OR UserGroup = 'Initial'
正确的方法应该是:
select A from MyTable
inner join Table1 on
MyTable.A = case when UserGroup <> 'Initial' then Table1.A else MyTable.A end
or MyTable.B = Table1.B
or MyTable.C = Table1.C
您可以根据需要将实际或更改为和。您可以使用动态sql
declare @Query varchar(max)
set @Query = ' SELECT A
FROM myTable
'
if (UserGroup <> 'Initial')
Begin
set @Query = @Query +'INNER JOIN Table1 ON MyTable.A = Table1.A'
End
exec(@Query)
在标准SQL中,每个查询都有一个固定的形状-源表是固定的,结果中列的数量、类型和名称是固定的。您可以使用一些特定的语言扩展或动态SQL,但我们需要知道您使用的是哪种SQL产品。请添加一个合适的标签。仅供我参考。你用过这个吗?只是想知道这是否有效。@Ashutsharya它在MSSQL中有效。你还没有说你正在使用什么数据库,所以我不能确定它是否能与你的数据库一起工作,但就是这样。在MS SQL中,on可以与通常的where In联接互换使用。@Ashutsharya是的,但是什么SQL server?有很多SQL server软件——PostgreSQL、MySQL、MS SQL等等。他们在某些方面都不同。为什么不试试呢?@LittleSweetSeas不一定。执行计划通常在第一次运行SQL variant时也会被缓存,并且您仍然可以将参数传递给exec的查询。动态SQL并不都是坏的。你只需要更加小心。