SQL делает внутреннее соединение, если условие выполнено
Я хочу хороший способ улучшить свой код 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
и я хотел бы сделать это следующим образом:
@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
изменить
решение (спасибо @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))
Ответы
Ответ 1
Это должно (приблизительно) сделать то же самое:
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)
Конечно, это также означает, что любые другие ссылки на столбцы внутри systemTable
должны быть записаны, чтобы ожидать, что такие столбцы будут NULL
.
Ответ 2
Как насчет динамического 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)