2016-06-10 8 views
2

Wenn ich 'Bewertung' an den @sortBy Parameter übergeben, gibt es die Ergebnisse wie erwartet zurück. Wenn ich den Spaltennamen 'name' in der order by-Klausel fest codiere, gibt es die Ergebnisse wie erwartet zurück, aber bei Übergabe an den Parameter @sortBy gibt es Folgendes zurück: Fehler beim Konvertieren des Datentyps nvarchar in float.Reihenfolge nach Parameterwert in Fall Anweisung funktioniert nicht immer, aber wenn hart codiert es tut

Ich muss es funktionieren, wenn 'Name' übergeben wird.

DECLARE @sortBy   varchar(255) = N'name', 
    @sortDirection varchar(4) = N'D'  

SELECT *, 
    ROW_NUMBER() OVER(
     ORDER BY -- name DESC 
     CASE WHEN @sortDirection = 'A' THEN 
      CASE 
       WHEN @sortBy = 'rating' THEN overallRating 
       WHEN @sortBy = 'name' THEN name 
      END 
     END ASC 
     , CASE WHEN @sortDirection = 'D' THEN 
      CASE 
       WHEN @sortBy = 'rating' THEN overallRating 
       WHEN @sortBy = 'name' THEN name 
      END 
     END DESC 

    ) AS RowNumber INTO #Results 
FROM 
(
    SELECT id 
     , type 
     , name 
     , formatted_address 
     , icon 
     , reference 
     , lat 
     , lng 
     , place_id 
     , open_now 
     , photo_reference 
     , width 
     , height 
     , html_attribution 
     , price_level 
     , CASE WHEN 
      (SELECT AVG(rating) 
      FROM reviews r 
      WHERE r.places_id = place_id 
      AND r.delete_check = 0) IS NOT NULL 
     THEN (
      (SELECT AVG(rating) 
      FROM reviews r 
      WHERE r.places_id = place_id 
      AND r.delete_check = 0) + cast(rating as float))/2 
     ELSE 
      rating 
     END AS overallRating 
    from search_places 
    where search_id = 12 
) y 

SELECT COUNT(*) AS RecordCount FROM #Results 
SELECT * FROM #Results WHERE RowNumber BETWEEN 1 AND 20 
DROP TABLE #Results 

Antwort

3

brechen sie in vier Fällen.

SQL Demo

ROW_NUMBER() OVER(
     ORDER BY 
     CASE WHEN @sortDirection = 'A' AND @sortBy = 'rating' THEN overallRating END ASC, 
     CASE WHEN @sortDirection = 'A' AND @sortBy = 'name' THEN name END ASC, 
     CASE WHEN @sortDirection = 'D' AND @sortBy = 'rating' THEN overallRating END DESC, 
     CASE WHEN @sortDirection = 'D' AND @sortBy = 'name' THEN name END DESC) 

Und betrachten OPTION (RECOMPILE) bis zum Ende der Abfrage allow better index usage hinzufügen, wenn Sie Indizes haben, die möglicherweise eine Art für einen oder mehrere Fälle vermeiden könnte.

+0

@juan, danke ich wusste nicht über diese Seite. –

+1

ja. Ich lerne darüber vor ein paar Wochen. Verwenden Sie auch www.sqlFiddle.com, denn wenn Sie die Daten dorthin kopieren, erstellt er die DDL für Sie. Aber in letzter Zeit gab es einige Probleme, also benutze jetzt beide. –