我可以编写一个有条件表选择的查询

Cha*_*had 5 sql sql-server

我们有2个具有相同结构的表,并且基于一个变量,我想选择要选择的表,而不必在我的过程中编写2个查询.

这可能吗?

我试过了

declare @table int
set @table = 1 

Select orderID, Quantity 
from case when @table = 1 then tblOrders else tblSubscriptionOrders end
where filled = 0
Run Code Online (Sandbox Code Playgroud)

但那没用

squ*_*man 6

您需要为此使用动态SQL(假设您希望将其扩展到超过2个表),这可能会起作用但是不是最理想的,因为SQL不会为其生成统计信息并且更难以优化查询.

declare @table sysname
declare @SQL varchar(1000)

set @table = 'MyTable'
SET @SQL='SELECT orderID, Quantity FROM ' + QUOTENAME(@table) + ' WHERE filled=0'

exec sp_executesql @SQL
Run Code Online (Sandbox Code Playgroud)

或者,在存储过程中:

CREATE PROCEDURE p_ConditionalSelect @table sysname
as

declare @SQL varchar(1000)

set @table = 'MyTable'
SET @SQL='SELECT orderID, Quantity FROM ' + QUOTENAME(@table) + ' WHERE filled=0'

exec sp_executesql @SQL
Run Code Online (Sandbox Code Playgroud)


Lie*_*ers 5

一种选择是使用动态 SQL,但如果性能不是迫在眉睫的问题,则更简单的方法是仅使用UNION表并添加一个虚拟[table]列以供选择。

SELECT orderID, Quantity
FROM   (
  SELECT [table] = 1, orderID, Quantity
  FROM   tblOrders
  UNION ALL
  SELECT [table] = 2, orderID, Quantity
  FROM   tblSubscriptionOrders
  ) t
WHERE t.Table = @table
Run Code Online (Sandbox Code Playgroud)


JNK*_*JNK 5

如果只有两个表,则可以执行以下操作:

Declare @table = 1

SELECT *
FROM Table1
WHERE <stuff>
AND @Table = 1

UNION ALL

SELECT *
FROM Table2
WHERE <stuff>
AND @Table = 2
Run Code Online (Sandbox Code Playgroud)

筛选器打开@table将仅导致显示数据的两半之一。