Динамические изменения, какую таблицу выбрать из с помощью оператора S'L CASE

Я пытаюсь написать сохраненную процедуру и в зависимости от определенного значения столбца, я хочу иметь возможность изменить, какую таблицу я выбираю из. Я постараюсь привести пример:

SELECT ItemNumber,
       ItemType, 
       Description
FROM

CASE ItemType
WHEN 'A' THEN TableA
ELSE TableB
END

WHERE 

CASE ItemType
WHEN 'A' THEN ItemNumber = @itemNumber
ELSE PartNumber = @itemNumber
END

Как вы можете видеть, я не только динамически меняю таблицу, которую выбираю из, но так как эти две таблицы были сделаны в два разных раза двумя разными людьми, имена столбцов также отличаются.

Итак, мой вопрос: Что является лучшим способом для достижения этой цели, так как сервер S'L, кажется, не нравится мой запрос, который я построил.

Если любой, кто видит, что я пытаюсь сделать, может предложить лучший способ сделать это, я бы все уши :-)

Ответ на: "Динамические изменения, какую таблицу выбрать из с помощью оператора S'L CASE"

Количество ответов:5

Вы лучше использовать union запрос присоединиться к таблицам, а затем SELECT.

Кроме того, вы можете рассмотреть возможность создания представления для одной из таблиц, поэтому он тянет только столбцы вам нужно при переименовании их, то UNION, а затем выбрать из UNION.

Или используйте таблицу темпа для хранения результата от каждого запроса. Поместите создание временной таблицы в CASE (псевдокод, не протестирован):

CASE @itemType
   WHEN 'A'
      SELECT ACol1 AS Col1, ACol2 AS Col2
      FROM TABLE_A
      INTO #tempTable
      WHERE ItemNumber = @itemNumber
   ELSE
      SELECT BCol1 AS Col1, BCol2 AS Col2
      FROM TABLE_B
      INTO #tempTable
      WHERE PartNumber = @itemNumber
END

SELECT * FROM #tempTable

Вы можете попробовать создать динамическое заявление S'L как строку, а затем назвать sp_executesql сохраненную процедуру для выполнения строки. Подробнее и примеры читайте в материале

"-22".

Вы действительно не объясняя, где ItemType is coming from. As suggested идет от. Как было предложено UNION might be applicable if you are simply combining two tables. может быть применимо, если вы просто объединения двух таблиц.

Вот еще одна возможность, которая может относиться к вашей проблеме:

SELECT ItemNumber,
       ItemType, 
       COALESCE(TableA.Description, TableB.Description) AS Description
FROM Items
LEFT JOIN TableA
    ON Items.ItemType = 'A'
    AND TableA.ItemNumber = Items.ItemNumber
LEFT JOIN TableB
    ON Items.ItemType <> 'A'
    AND TableB.ItemNumber = Items.ItemNumber

Вы не можете использовать case заявление в из положения, но вы можете использовать следующее вместо:

SELECT itemnumber, itemtype, description
  FROM tablea
 WHERE itemnumber = @itemnumber AND itemtype = 'A'
UNION ALL
SELECT itemnumber, itemtype, description
  FROM tableb
 WHERE partnumber = @itemnumber AND itemtype <> 'A'

Я не знаю, почему вы хотите сделать что-то в одном заявлении S'L .. Я не человек сервера S'L, но в процедуре хранения Oracle вы можете написать что-то вроде этого

If itemtype = 'A' 
Then 
 <statement for table A>
Else
 <statement for Table B>
End if

Что-то вроде этого должно работать в S'L Server, тоже .. может быть, кто-то может расширить на этом?