根据输入参数查询不同的表

时间:2015-07-22 20:20:00

标签: sql parameters

我有一个非常简单的存储过程,允许用户根据日期显示不同的数据。我有2个参数,一个开始日期和结束日期。所以基本上,查询根据日期范围返回数据。但是,根据这些日期,我需要查询不同的表。因此,如果用户想要2015年1月1日至2015年1月31日的数据,则需要一个表。如果他们想要2015年2月1日至2015年2月28日的数据,那么它就是一张不同的表。他们也被允许越过,所以2015年1月1日 - 2015年2月28日。

SELECT * 
FROM shipments 
JOIN costs ON shipment.shipmentid = cost.shipmentid 
WHERE ship_date between @sdate and @edate

如果ship_date在2015年2月1日之前,那么我需要从另一个成本表中提取。

我希望这是有道理的。动态SQL会成为可行的方法吗?

3 个答案:

答案 0 :(得分:0)

您只想使用您选择的后端编程语言动态创建查询。没有纯粹的SQL方法来实现它。

答案 1 :(得分:0)

最简单的方法是功能,例如:

if @sDate <'some_date'

@tableName = 'first_table';

else 

@tableName = 'other_table';

end if;


ELECT * 
FROM @tableName
JOIN costs ON shipment.shipmentid = cost.shipmentid 
WHERE ship_date between @sdate and @edate

您也可以在桌面上进行联合,但这可能会产生成本问题(不确定表的大小)。

答案 2 :(得分:0)

我避免在SP中动态构建SQL,因为它会带走“预编译”的好处。正如dognose所提到的,Union确实是最好的途径。 总有不止一种方法可以做到这一点,你可以尝试性能;但类似的东西应该有效:

SELECT * FROM shipments
INNER JOIN (
    SELECT col1,col2,col3,shipment_id FROM costs
    WHERE ship_date > "2/1/2015" 
    UNION
    SELECT col1,col2,col3,shipment_id FROM costs_old
    WHERE ship_date <= "2/1/2015" 
) AS costs_union ON shipments.shipmentid = costs_union.shipmentid
WHERE shipments.ship_date between @sdate and @edate

根据这些成本表的大小,您可能希望联合查询中的WHERE子句使它们变小......