2014-07-09 28 views
0

執行此語句時遇到問題。SQL排序:帶參數的ORDER BY

我想在這裏實現的是我的結果將使用參數的條件排序。

例如,我想按升序對userName進行排序,因此,在我的web應用程序編碼中,我有一個參數@condition,當它讀取'userName'時,下面的sql語句會執行。

的錯誤是:

Msg 206, Level 16, State 2, Line 1 
Operand type clash: int is incompatible with date 

Msg 206, Level 16, State 2, Line 1 
Operand type clash: int is incompatible with date 

Msg 206, Level 16, State 2, Line 1 
Operand type clash: int is incompatible with date 

Msg 206, Level 16, State 2, Line 1 
Operand type clash: int is incompatible with date 

Msg 206, Level 16, State 2, Line 1 
Operand type clash: int is incompatible with date 

Msg 206, Level 16, State 2, Line 1 
Operand type clash: int is incompatible with date 

它出現6次。

我不確定CASE是否正確使用。

我想要的結果是,當一個條件被調用並插入到@條件,它應該排序該特定條件的結果。

數據庫的屬性在這種方式聲明:

C.joinDate - DATE 
C.userName - VARCHAR(20) 
C.firstName - VARCHAR(20) 
C.lastName - VARCHAR(15) 
C.contact - CHAR(8) 
C.dob - DATE 
C.userStatus - VARCHAR(8) 
C.totalPoints - INT 
R.resID - VARCHAR(8) 
P.orderID - VARCHAR(8) 
D.orderID - VARCHAR(8) 
CR.securityCode - VARCHAR(10) 
C.loginAttempted - INT 



SELECT C.joinDate, C.userName, (C.firstName+' '+C.lastName) AS Name, 
C.contact, C.dob, C.userStatus, C.totalPoints, COUNT(R.resID) AS Res, 
COUNT(P.orderID) AS PreOrd, COUNT(D.orderID) AS DelOrd, 
COUNT(CR.securityCode) AS Redeem, C.loginAttempted FROM Customer C 
full join Reservation R ON C.userID = R.userID full join PreOrder P 
ON R.resID = P.ResID full join DeliveryOrder D ON D.userID = C.userID 
full join CustomerRedemption CR ON CR.userID = C.userID WHERE 
(C.firstName+' '+C.lastName) LIKE '%%' and c.userName LIKE '%%' and 
c.contact LIKE '%%' and c.userStatus LIKE '%%' GROUP BY C.joinDate, 
C.userName, (C.firstName+' '+C.lastName), C.contact, C.dob, 
C.userStatus, C.totalPoints, C.loginAttempted HAVING C.userName IS NOT 
NULL ORDER BY   CASE 'userName' 
       WHEN 'joinDate' THEN joinDate 
       WHEN 'userName' THEN userName 
       WHEN 'Name' THEN (C.firstName+' '+C.lastName) 
       WHEN 'dob' THEN dob 
       WHEN 'userSatus' THEN userStatus 
       WHEN 'totalPoints' THEN totalPoints 
       WHEN 'totalPoints' THEN totalPoints 
       WHEN 'Res' THEN COUNT(R.resID) 
       WHEN 'PreOrd' THEN COUNT(P.orderID) 
       WHEN 'DelOrd' THEN COUNT(D.orderID) 
       WHEN 'Redeem' THEN COUNT(CR.securityCode) 
       END 
+0

你使用了哪個數據庫? – Taryn

+0

無論數據庫如何,如果查詢的結果將在數據庫之外使用,則由某種類型的客戶端在數據庫中不分段。在客戶端做這件事要便宜得多。 – Darek

回答

1

當您以一個case語句的情況下所有可能的輸出必須是同一類型的。您需要將案例陳述分解爲多個案例陳述。

每個case語句都應該返回一個單一的類型,而其他情況則返回NULL。您可以通過將所有這些案例合併爲一個訂單。

0

您也許想嘗試這樣的事:

CASE WHEN @condition = 'username' THEN username 
    WHEN @condition ='joinDate' THEN joinDate 
    WHEN @condition = 'userName' THEN userName 
    WHEN @condition = 'Name' THEN (C.firstName+' '+C.lastName) 
    WHEN @condition = 'dob' THEN dob 
    WHEN @condition = 'userSatus' THEN userStatus 
    WHEN @condition = 'totalPoints' THEN totalPoints 
    WHEN @condition = 'totalPoints' THEN totalPoints 
    WHEN @condition = 'Res' THEN COUNT(R.resID) 
    WHEN @condition = 'PreOrd' THEN COUNT(P.orderID) 
    WHEN @condition = 'DelOrd' THEN COUNT(D.orderID) 
    WHEN @condition = 'Redeem' THEN COUNT(CR.securityCode) 
    END 

或你有它也將是正確的,但有一個小的修正:

CASE @condition 
    WHEN 'username' THEN username 
    WHEN 'joinDate' THEN joinDate 
    WHEN 'userName' THEN userName 
    WHEN 'Name' THEN (C.firstName+' '+C.lastName) 
    WHEN 'dob' THEN dob 
    WHEN 'userSatus' THEN userStatus 
    WHEN 'totalPoints' THEN totalPoints 
    WHEN 'totalPoints' THEN totalPoints 
    WHEN 'Res' THEN COUNT(R.resID) 
    WHEN 'PreOrd' THEN COUNT(P.orderID) 
    WHEN 'DelOrd' THEN COUNT(D.orderID) 
    WHEN 'Redeem' THEN COUNT(CR.securityCode) 
    END 
0

是的,你的問題是你的CASE聲明。首先,參數需要在聲明本身中。

... 
HAVING C.userName IS NOT NULL 
ORDER BY 
CASE @condition 
WHEN 'joinDate' THEN joinDate 
... 

您還應該在CASE語句末尾有一個ELSE部分。

請參閱CASE頁面的C部分。 http://msdn.microsoft.com/en-us/library/ms181765.aspx

0

case聲明中,每個when必須返回兼容的類型。在你的情況下,你需要三個case語句,一個用於字符串,一個用於數字,一個用於日期。

order by 
    CASE @condition 
     WHEN 'joinDate' THEN joinDate 
     WHEN 'dob' THEN dob 
    END, 
    CASE @condition 
     WHEN 'userName' THEN userName 
     WHEN 'Name' THEN (C.firstName+' '+C.lastName) 
     WHEN 'userSatus' THEN userStatus 
    END, 
    CASE @condition 
     WHEN 'totalPoints' THEN totalPoints 
     WHEN 'totalPoints' THEN totalPoints 
     WHEN 'Res' THEN COUNT(R.resID) 
     WHEN 'PreOrd' THEN COUNT(P.orderID) 
     WHEN 'DelOrd' THEN COUNT(D.orderID) 
     WHEN 'Redeem' THEN COUNT(CR.securityCode) 
    END; 

或者你可以將所有內容轉換爲文本:

 WHEN 'joinDate' THEN to_char(joinDate, 'yyyy-mm-dd') 

只是一定的形式是這樣的詞彙順序相同日期/數字順序。

另外,having子句用於彙總結果。 C.userName IS NOT NULL測試應該在where子句中,因爲您正在使用它來在任何聚合函數被應用之前過濾結果集。使用having的一個例子將是這樣

having COUNT(P.orderID) > 0 

這執行附加的濾波後的集合函數已經返回的值。