如何根据变量选择表和相应字段进行查询

yan11cn 2010-01-06 10:51:42
sql用到的少 学的也很浅 现在我遇到这个问题,数据库中有好几个表,结构不尽相同,字段名字也是。
如:
表A中 a1是日期时间
表B中 b2是日期时间
.
.
.
我现在得根据用户的选择进行查询某一个时间段的XX记录
我想到了用case语句
于是在sql 2005中先用变量模拟用户的选择这么写了:

DECLARE @MyVar INT
SET @MyVar = 1

SELECT TOP 30 *(CASE @MyVar
WHEN 1 THEN convert(VARCHAR(10),a1,120)
WHEN 2 THEN convert(VARCHAR(10),b2,120)
END)AS dToday,Count(*) AS Nums
FROM(CASE @MyVar
WHEN 1 THEN A
WHEN 2 THEN B
END)
WHERE(CASE @MyVar
WHEN 1 THEN convert(VARCHAR(10),a1,120)
WHEN 2 THEN convert(VARCHAR(10),b2,120)
END) BETWEEN '2002-01-01' AND '2009-05-01'
GROUP BY(CASE @MyVar
WHEN 1 THEN convert(VARCHAR(10),a1,120)
WHEN 2 THEN convert(VARCHAR(10),b2,120)
END)

我想看到上面的语句 我的意图 大家能理解吧
可惜怎么改也都不对 请大家帮忙给个解决方法
语句也不限于CASE 但是因为这样的表其实很多 所以最好不要用IF来挨个判断。
分数酌情给加
...全文
110 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
yan11cn 2010-01-06
  • 打赏
  • 举报
回复
呵呵 问题解决了 9楼的代码可行
谢谢 nianran520 和 dawugui的帮忙啦
nianran520 2010-01-06
  • 打赏
  • 举报
回复
看9楼~[Quote=引用 11 楼 yan11cn 的回复:]
哦 谢谢8楼 请问我该如何在数据库中最终执行这个得到的字符串呢?
[/Quote]
yan11cn 2010-01-06
  • 打赏
  • 举报
回复
哦 谢谢8楼 请问我该如何在数据库中最终执行这个得到的字符串呢?
dawugui 2010-01-06
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 yan11cn 的回复:]
引用 4 楼 dawugui 的回复:
引用 2 楼 dawugui 的回复:
或者自己用union all来完成.
你的条件我没有仔细看.


我根据用户判断 只需要取某一表的数据。。。
选择了A表 就不需要B表的数据了。。
[/Quote]
估计你没有看懂我的意思.

DECLARE @MyVar INT
SET @MyVar = 1

select a.* from a where @MyVar = 1
union all
select b.* from a where @MyVar = 2
...

不过你union all时,需要把查询的结果中所有的字段的类型和顺序设置成一样的.
nianran520 2010-01-06
  • 打赏
  • 举报
回复
DECLARE @MyVar INT 
SET @MyVar = 1

declare @sql varchar(8000)
select @sql = 'SELECT '+CASE @MyVar
WHEN 1 THEN 'convert(VARCHAR(10),a1,120)'
WHEN 2 THEN 'convert(VARCHAR(10),b2,120)'
END+' AS dToday,Count(*) AS Nums
FROM '+CASE @MyVar
WHEN 1 THEN 'A'
WHEN 2 THEN 'B'
END+'
WHERE '+CASE @MyVar
WHEN 1 THEN 'convert(VARCHAR(10),a1,120)'
WHEN 2 THEN 'convert(VARCHAR(10),b2,120)'
END+' BETWEEN ''2002-01-01'' AND ''2009-05-01''
GROUP BY '+CASE @MyVar
WHEN 1 THEN 'convert(VARCHAR(10),a1,120)'
WHEN 2 THEN 'convert(VARCHAR(10),b2,120)'
END

exec(@sql)
nianran520 2010-01-06
  • 打赏
  • 举报
回复

--这样吧,动态执行
DECLARE @MyVar INT
SET @MyVar = 1

print
'SELECT '+CASE @MyVar
WHEN 1 THEN 'convert(VARCHAR(10),a1,120)'
WHEN 2 THEN 'convert(VARCHAR(10),b2,120)'
END+' AS dToday,Count(*) AS Nums
FROM '+CASE @MyVar
WHEN 1 THEN 'A'
WHEN 2 THEN 'B'
END+'
WHERE '+CASE @MyVar
WHEN 1 THEN 'convert(VARCHAR(10),a1,120)'
WHEN 2 THEN 'convert(VARCHAR(10),b2,120)'
END+' BETWEEN ''2002-01-01'' AND ''2009-05-01''
GROUP BY '+CASE @MyVar
WHEN 1 THEN 'convert(VARCHAR(10),a1,120)'
WHEN 2 THEN 'convert(VARCHAR(10),b2,120)'
END
-----------------------------
SELECT convert(VARCHAR(10),a1,120) AS dToday,Count(*) AS Nums
FROM A
WHERE convert(VARCHAR(10),a1,120) BETWEEN '2002-01-01' AND '2009-05-01'
GROUP BY convert(VARCHAR(10),a1,120)
yan11cn 2010-01-06
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 dawugui 的回复:]
引用 2 楼 dawugui 的回复:
或者自己用union all来完成.
你的条件我没有仔细看.

[/Quote]
我根据用户判断 只需要取某一表的数据。。。
选择了A表 就不需要B表的数据了。。
dawugui 2010-01-06
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 yan11cn 的回复:]
只能用if eles么???
表真不少。。。。

[/Quote]
你看四楼的union all能否满足?
yan11cn 2010-01-06
  • 打赏
  • 举报
回复
只能用if eles么???
表真不少。。。。
dawugui 2010-01-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 dawugui 的回复:]
如果是根据条件来选择查询表,貌似得用if else了.帮顶.
[/Quote]

如果是根据条件来选择查询表,貌似得用if else了.帮顶.
或者自己用union all来完成.
你的条件我没有仔细看.
大致如下:

select a.* , b.* from a , b where a.id = b.id and a.其他条件
union all
select a.* , c.* from a , c where a.id = c.id and a.其他条件

其中,a.* , b.* 和a.* , c.*需要一样的字段类型和顺序,名字可以不一样.
nianran520 2010-01-06
  • 打赏
  • 举报
回复
用if分开判断吧
dawugui 2010-01-06
  • 打赏
  • 举报
回复
如果是根据条件来选择查询表,貌似得用if else了.帮顶.
nianran520 2010-01-06
  • 打赏
  • 举报
回复
汗,你把case when的功能看得太强大了

22,206

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧