Подтвердить что ты не робот

Условный оператор JOIN SQL Server

Можно ли сделать следующее:

IF [a] = 1234 THEN JOIN ON TableA 
ELSE JOIN ON TableB

Если да, то какой правильный синтаксис?

4b9b3361

Ответ 1

Я думаю, что то, что вы просите, будет работать, присоединив таблицу Initial к Option_A и Option_B, используя LEFT JOIN, что будет произведите что-то вроде этого:

Initial LEFT JOIN Option_A LEFT JOIN NULL
OR
Initial LEFT JOIN NULL LEFT JOIN Option_B

Пример кода:

SELECT i.*, COALESCE(a.id, b.id) as Option_Id, COALESCE(a.name, b.name) as Option_Name
FROM Initial_Table i
LEFT JOIN Option_A_Table a ON a.initial_id = i.id AND i.special_value = 1234
LEFT JOIN Option_B_Table b ON b.initial_id = i.id AND i.special_value <> 1234

Как только вы это сделали, вы игнорируете набор NULLS. Дополнительный трюк здесь находится в строке SELECT, где вам нужно решить, что делать с полями NULL. Если таблицы Option_A и Option_B аналогичны, вы можете использовать функцию COALESCE, чтобы вернуть первое значение NON NULL (в соответствии с примером).

Другой вариант заключается в том, что вам просто нужно будет указать поля Option_A и поля Option_B, а также использовать все, что используется ResultSet для определения того, какие поля использовать.

Ответ 2

Я не согласен с решением, предлагающим 2 левых соединения. Я думаю, что функция с табличной оценкой более уместна, поэтому у вас нет всех коалесцирующих и дополнительных объединений для каждого условия, которое у вас было бы.

CREATE FUNCTION f_GetData (
    @Logic VARCHAR(50)
) RETURNS @Results TABLE (
    Content VARCHAR(100)
) AS
BEGIN
    IF @Logic = '1234'
        INSERT @Results
            SELECT Content
            FROM Table_1
    ELSE
        INSERT @Results
            SELECT Content
            FROM Table_2
    RETURN
END
GO

SELECT *
FROM InputTable
    CROSS APPLY f_GetData(InputTable.Logic) T

Ответ 3

Это просто добавляет, что запрос может быть построен динамически на основе условий. Пример приведен ниже.

DECLARE @a INT = 1235
DECLARE @sql VARCHAR(MAX) = 'SELECT * FROM [sourceTable] S JOIN ' + IIF(@a = 1234,'[TableA] A ON A.col = S.col','[TableB] B ON B.col = S.col') 

EXEC(@sql)
--Query will be
/*
SELECT * FROM [sourceTable] S JOIN [TableB] B ON B.col = S.col
*/