3 Stimmen

T-SQL Ein Problem mit SELECT TOP (case [...])

Ich habe eine solche Anfrage:

(wie Sie sehen, möchte ich 50% der gesamten Zeilen oder die ersten 100 Zeilen usw. abrufen)

//@AllRowsSelectType is INT

 SELECT TOP (
    case @AllRowsSelectType
        when 1 then 100 PERCENT 
        when 2 then 50 PERCENT
        when 3 then 25 PERCENT
        when 4 then 33 PERCENT
        when 5 then 50
        when 6 then 100
        when 7 then 200 
    end
            ) ROW_NUMBER() OVER(ORDER BY [id]) AS row_num, a,b,c etc

warum habe ich den Fehler : "Falsche Syntax beim Schlüsselwort 'PERCENT'". in der Zeile "wenn 1 [...]"

6voto

Mark Byers Punkte 761508

Die Syntax für TOP ist:

TOP (expression) [PERCENT]
[ WITH TIES ]

Die reserviertes Schlüsselwort PERCENT kann nicht in den Ausdruck aufgenommen werden. Stattdessen können Sie zwei verschiedene Abfragen durchführen: eine für den Fall, dass Sie PERCENT benötigen, und eine andere für den Fall, dass Sie es nicht benötigen.

Wenn es sich um eine einzige Abfrage handeln soll, können Sie beide Abfragen ausführen und UNION ALL verwenden, um die Ergebnisse zu kombinieren:

SELECT TOP (
    CASE @AllRowsSelectType
        WHEN 1 THEN 100
        WHEN 2 THEN 50
        WHEN 3 THEN 25
        WHEN 4 THEN 33 
        ELSE 0
    END) PERCENT
    ROW_NUMBER() OVER(ORDER BY [id]) AS row_num, a, b, c, ...
UNION ALL
SELECT TOP (
    CASE @AllRowsSelectType
        WHEN 5 THEN 50
        WHEN 6 THEN 100
        WHEN 7 THEN 200
        ELSE 0
    END)
    ROW_NUMBER() OVER(ORDER BY [id]) AS row_num, a, b, c, ...

2voto

Jon Hanna Punkte 106367

Außerdem vermischen Sie zwei verschiedene Arten der Nutzung. Die andere ist.

DECLARE @ROW_LIMT int

IF @AllRowsSelectType < 5
    SELECT @ROW_LIMIT = COUNT(*)/@AllRowsSelectType FROM myTable -- 100%, 50%, 33%, 25%
ELSE
    SELECT @ROW_LIMIT = 50 * POWER(2, @AllRowsSelectType - 5) -- 50, 100, 200...

WITH OrderedMyTable
(
  select *, ROW_NUMBER() OVER (ORDER BY id) as rowNum
  FROM myTable
)
SELECT * FROM OrderedMyTable
WHERE rowNum <= @ROW_LIMIT

0voto

Damien_The_Unbeliever Punkte 227101

Das könnten Sie tun:

select top (CASE @FilterType WHEN 2 THEN 50 WHEN 3 THEN 25 WHEN 4 THEN 33 ELSE 100 END) percent * from
(select top (CASE @FilterType WHEN 5 THEN 50 WHEN 6 THEN 100 WHEN 7 THEN 200 ELSE 2147483647 END) * from
<your query here>
) t
) t

Was vielleicht leichter zu lesen ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X