2015-08-25 163 views
-1

經與SQL命令的問題,我有一個這樣的表在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檢查。
  • 如果沒有COL1以A結尾,那麼它應該切換到COL2檢查
  • 如果沒有COL2以b結束,沒有行應退還

任何幫助,將不勝感激。我嘗試在SQL中執行case語句。它沒有按我的預期工作。

+3

順序不排除行。您是訂購結果數據還是過濾? – UnhandledExcepSean

+0

你可以展示你使用Case語句嘗試了些什麼? – pvieira

+2

另外,請停止使用'GETDATE()+ 1' - 這是+1 ....什麼?!?!?第二?分鐘?小時?年?月?天?請改爲使用'DATEADD(datepart,.....)'函數,使其**清除**您要添加或減去日期的內容 –

回答

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 
0

如果我的理解沒錯,要篩選記錄:

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