2010-11-02 100 views
1

我有一個表A,如果參數@x是0,我想按日期排序,否則按名稱排序。 這是一個例子:SQL-ORDER BY in IF-ELSE CLAUSE

declare @x int set @x = 0 
if(@x=0)(
SELECT * FROM A 
order by DATE 
) 
else 
(
SELECT * FROM A 
order by Name 
) 

當嘗試做的SQL Server返回2 egual誤差作爲關鍵字「順序」附近

不正確的語法。

我該怎麼辦?

回答

1
declare @x int set @x = 0 
if(@x=0) 
begin 
SELECT * FROM A 
order by DATE 
end 
else 
begin 
SELECT * FROM A 
order by Name 
end 
1
SELECT 
    * 
FROM 
    A 
ORDER BY 
    CASE WHEN @x = 0 THEN Date ELSE Name END 
+1

我不知道它會工作的塊,假設'DATE'是日期類型和名稱是字符串類型。轉換到變體會有所幫助,但這可能會影響(以糟糕的方式)使用索引。 – 2010-11-02 10:12:33

0

如果您的查詢變得相當複雜,然後將其複製到一個IF/ELSE可以變得相當繁重的兩側。你可以在你的ORDER BY中使用CASE表達式。在這種情況下,您可能會這樣做:

SELECT * FROM A ORDER BY CASE WHEN @x=0 THEN DATE END, CASE WHEN @x<>0 THEN Name END 

這可以擴展到更多條件/列。你只需要確保每個CASE表達式都返回一個合理的數據類型。

2

試試這個

SELECT * FROM A 
order by 
Case @x When 0 Then Cast(DATE as sql_variant) Else Name End 

鑄造需要動態排序帶有日期的工作 - 我試圖找到一個參考,但你需要一個可以自動澆鑄爲常見類型類型和日期無法完成。因此鑄造自己。

下面是一些選項的鏈接。請注意混合數據類型的部分。

http://www.4guysfromrolla.com/webtech/010704-1.shtml

0

括號()是錯誤。改爲使用BEGINEND

DECLARE @x INT 
SET @x = 0 

IF (@x = 0) BEGIN 
    SELECT * FROM A ORDER BY DATE 
END 
ELSE BEGIN 
    SELECT * FROM A ORDER BY Name 
END 

而且,在我看來,作爲DATE不是好主意

0

正如答案中所述,但沒有解釋。

SQL使用BEGIN - END的語法,而不是()或{}的命令