2016-08-09 171 views
1

Ich bin in einem optionalen OrderBy-Wert übergeben worden, der standardmäßig auf DESC gesetzt werden sollte, und wenn dieser Wert auf false festgelegt ist, sollte ORDER BY ASC. Ich bin nicht wirklich sicher, wie man diese Bestellung basierend auf der Eingabe durchführt. Hier ist, was ich habe zur Zeit:Optionaler OrderBy-Parameter in der gespeicherten MySQL-Prozedur

CREATE DEFINER=`app`@`%` PROCEDURE `BLAH`(
pWithdrawalTransactionId INT, 
pLimit INT, 
pSortDescending TINYINT 
) 
BEGIN 
    DECLARE vLimit INT DEFAULT COALESCE(pLimit, 100); 
    DECLARE vSort TINYINT DEFAULT COALESCE(pSortDescending, 1); 

    SELECT 
     f.WithdrawalFulfillmentId, f.PaymentStatusId, f.PaymentProcessorId, f.PaymentTypeId, r.Amount, r.RequestedAmount, r.NativeAmount, r.NativeRequestedAmount, r.RefundTransactionId, r.UpdatedDate 
    FROM 
     FinOps.UserWithdrawalFulfillment f 
    INNER JOIN 
     FinOps.UserRefundTransaction r ON f.RefundTransactionId = r.RefundTransactionId 
    WHERE 
     f.WithdrawalTransactionId = pWithdrawalTransactionId 
    LIMIT 
     vLimit; 
END 
+0

Es hängt davon ab, welche Spalte (Typ) Sie bestellen möchten und wenn Sie brauchen Ihre Indizes, um mit der Reihenfolge zu arbeiten (zB wenn Sie einen zusammengesetzten Index haben, der 'WithdrawalTransactionId' oder' RefundTransactionIdand' und Ihre Bestellspalte enthält) – Solarflare

+0

Ich möchte mit der WithdrawalTransactionId bestellen, wenn das hilft. Aber der wahre Kampf ist der optionale Teil –

Antwort

1

So die richtige Weg, dies zu tun, so sein würde:

CREATE DEFINER=`app`@`%` PROCEDURE `BLAH`(
pWithdrawalTransactionId INT, 
pLimit INT, 
pSortDescending TINYINT 
) 
BEGIN 
    DECLARE vLimit INT DEFAULT COALESCE(pLimit, 100); 
    DECLARE vSort TINYINT DEFAULT COALESCE(pSortDescending, 1); 

    SELECT 
     f.WithdrawalFulfillmentId, f.PaymentStatusId, f.PaymentProcessorId, f.PaymentTypeId, r.Amount, r.RequestedAmount, r.NativeAmount, r.NativeRequestedAmount, r.RefundTransactionId, r.UpdatedDate 
    FROM 
     FinOps.UserWithdrawalFulfillment f 
    INNER JOIN 
     FinOps.UserRefundTransaction r ON f.RefundTransactionId = r.RefundTransactionId 
    WHERE 
     f.WithdrawalTransactionId = pWithdrawalTransactionId 
    ORDER BY CASE WHEN pSortDescending = 1 THEN WithdrawalFulfillmentId * -1 ELSE WithdrawalFulfillmentId END ASC 
    LIMIT 
     vLimit; 
END 
+0

Großartig, das funktioniert! Vielen Dank! –