想从个table1中取出记录,条件是这样的,字段place表示地区,有省份或全国,还有时段time2,要对应白天、黑夜,或者是全天。顺序是这样的。
1、首先选取省份="江苏",且时段="白天"的记录
2、如果上一步没有记录,则选择省份="江苏",且时段="全天"的记录
3、如果上一步没有记录,则选择省份="全国",且时段="白天"的记录
4、如果上一步没有记录,则选择省份="全国",且时段="全天"的记录这种情况,如果按照笨方法,是要select 4次数据库的吧,我感觉这样有点浪费资源,求一个高效的语句。谢谢。
最终要给出一条记录的。

解决方案 »

  1.   

    哦,对了。补充一下。如果取出的记录不止一条,最好能随机取一条,如order by newid()
      

  2.   

    try-
    select 
      top 1 *
    from
      tb
    order by
      case when place='江苏' then 1 when place='全国' then 2 else 3 end,
      case when time2='白天' then 1 when time2='全天' then 2 else 3 end,
      newid()
      

  3.   

    哥们,谢谢你的IDEA,不过我想,假设 条件是 江苏、白天 的记录有5条,这样的语句能够保证取出来的记录只在这5条记录中,而不是其外?大概不能吧。全国、白天的也有可能被选出来的。也许是我第一帖没讲清楚,这里补充一下, 选出来的语句必须是同一级的记录随机。就是1、2、3步中有任意记录,后面就直接CUT掉,然后随机。 
      

  4.   


    测试结果即真理,楼主搞点测试数据测试一下就知道了。
    你要取5条记录的话,就是 top 5
      

  5.   


    ---try
     order by case when 列='' then 1 else .... end
      

  6.   

    SELECT TOP 1 a.*
    FROM table 1 a
    INNER JOIN
    (
    SELECT idx1=1,state = '江苏', dRange = '白天',
    UNION ALL
    SELECT 2,'江苏','全天'
    UNION ALL
    SELECT 3,'全国','白天'
    UNION ALL
    SELECT 4,'全国','全天'
    ) b
    ON a.state = b.state AND a.dRange = b.dRange
    ORDER BY a.idx