动态更改使用SQL案例语句选择的表
-
20-08-2019 - |
题
我正在尝试编写一个存储过程,并根据特定的列值,我希望能够更改我从中选择的表。我会尝试举一个例子:
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似乎不喜欢我构建的查询。
如果有人看到我想做的事情可以提出一种更好的方法来做到这一点,我将全力以赴:-)
解决方案
您无法从子句中使用案例语句,但是可以使用以下内容:
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'
其他提示
您可以尝试将动态SQL语句构建为字符串,然后调用SP_EXECUTESQL存储过程以执行字符串。
看 这里 有关更多信息和示例。
我不确定您为什么要在一个SQL语句中做事。.我不是SQL Server的人,但是在Oracle存储的过程中,您可以写下类似的内容
If itemtype = 'A'
Then
<statement for table A>
Else
<statement for Table B>
End if
这样的事情也应该在SQL Server中起作用。也许有人可以扩展这一点?
您真的没有解释在哪里 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
您最好先使用Union查询来首先加入表格,然后选择。
另外,您可以考虑为其中一张表创建视图,因此它仅在重命名它们时才拉出所需的列,然后从联合中选择。
或使用临时表存储每个查询的结果。将临时表的创建放在情况下(伪代码,未测试):
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
不隶属于 StackOverflow