sql用到的少 学的也很浅 现在我遇到这个问题,数据库中有好几个表,结构不尽相同,字段名字也是。
如:
表A中 a1是日期时间
表B中 b2是日期时间
  .
  .
  .
我现在得根据用户的选择进行查询某一个时间段的XX记录
我想到了用case语句
于是在sql 2005中先用变量模拟用户的选择这么写了:DECLARE @MyVar INT
SET @MyVar = 1SELECT 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来挨个判断。
分数酌情给加

解决方案 »

  1.   

    汗,你把case when的功能看得太强大了
      

  2.   

    只能用if eles么???
    表真不少。
      

  3.   

    你看四楼的union all能否满足?
      

  4.   


    --这样吧,动态执行
    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)
      

  5.   

    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)
      

  6.   

    估计你没有看懂我的意思.DECLARE @MyVar INT 
    SET @MyVar = 1 select a.* from a where @MyVar = 1 
    union all
    select b.* from a where @MyVar = 2
    ...不过你union all时,需要把查询的结果中所有的字段的类型和顺序设置成一样的.
      

  7.   

    呵呵 问题解决了 9楼的代码可行
    谢谢 nianran520 和 dawugui的帮忙啦