2009-01-29 75 views
7

我正在尝试编写存储过程,并且根据特定的列值,我希望能够更改从中选择的表格。我会尽力举一个例子:动态更改要使用SQL 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 

正如你所看到的,不仅是我在动态变化的,我从选择表,但由于这两个表是由两个不同的人在两个不同时间做的列名也是不同的。

所以,我的问题是:什么是最好的方法来实现这一点,因为SQL Server似乎不喜欢我构建的查询。

如果有人谁看到什么,我试图做可以提出一个更好的方式来做到这一点,我会所有的耳朵:-)

+0

虽然人们通常假设“SQL Server”==“MS SQL Server”,但如果您在问题和标签中说明了这一点,则会更好。我正在更换标签,如果我错了,请回复。 – 2009-01-29 17:44:20

+4

sqlserver是Microsoft SQL Server的标记。目前没有其他产品是这个名称,它是唯一有用的标签。 – 2009-01-29 17:54:42

回答

5

不能使用CASE语句在FROM子句,但可以改用以下内容:

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' 
0

您使用UNION查询第一联接表的更好,然后选择。另外,您可能会考虑为其中一个表创建视图,因此它只会在重命名它们时拔出所需的列,然后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 
3

你可以尝试建立动态SQL语句作为字符串,然后调用sp_executesql存储过程执行该字符串。

有关更多信息和示例,请参阅here

+0

我认为动态SQL在这里是非常必要的,除非模式更加病态。 – 2009-01-29 17:53:04

+0

我同意SP的设计非常糟糕,但我认为这是提出的问题的最简单解决方案。 – 2009-01-29 17:59:15

1

你真的没有解释ItemType来自哪里。建议UNION可能适用,如果你只是组合两个表。

这里可能涉及到您问题的另一种可能性:

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 
3

我不是确定为什么你想在一个SQL语句中做事情..我不是SQL Server的人,但在Oracle存储过程中,你可以写这样的东西

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

像这样的东西也应该在SQL Server中工作..也许有人可以扩大这个?