遇到SQL Order by Query的问题

时间:2015-08-25 17:05:38

标签: sql sql-server-2012

我在SQL Server 2012中有这样的表:

DECLARE @test TABLE (dateField datetime,
                     col1 varchar(10),
                     col2 varchar(10)
                    )

insert into @test
   select dateadd(day,-1,getdate()), 'Test A', 'Other A'
   union 
   select dateadd(day,-1,getdate()), 'Test E', 'Other E'
   union 
   select getdate(), 'Test B', 'Other B'
   union 
   select dateadd(day,1,getdate()), 'Test C', 'Other C' 
   union 
   select dateadd(day,1,getdate()), 'Test A', 'Other C'
   union  
   select dateadd(day,1,getdate()), 'Test D', 'Other B'

我想按特定顺序检索数据。

订单应该是:

dateField ASC 
Col1 ends with A
Col2 ends with B
  • 如果datefield大于今天的日期,则应切换到col1 check。
  • 如果没有col1以A结尾,则应切换到col2 check
  • 如果没有col2以B结尾,则不应返回任何行

任何帮助将不胜感激。我尝试在SQL中做case语句。它没有按照我的预期发挥作用。

2 个答案:

答案 0 :(得分:0)

你似乎有点困惑,如果它被过滤或排序或其组合。这样做。

select
    *
from (
    SELECT
        *
        ,substring(col1,len(col1),1) [LastCharCol1]
        ,substring(col2,len(col2),2) [LastCharCol2]
    FROM @test
) t
where 1=1
AND (
        [LastCharCol1]='A'
    OR  [LastCharCol2]='B'
)
order by CASE WHEN dateField>CONVERT(DATE,GETDATE()) THEN 1 ELSE 0 END DESC,CASE WHEN [LastCharCol1]='A' THEN 1 ELSE 0 END DESC,CASE WHEN [LastCharCol2]='B' THEN 1 ELSE 0 END DESC

答案 1 :(得分:0)

如果我理解正确,你想过滤记录:

select *
from @test
where dateField > getdate() and (col1 like '%A' or col2 like '%B')