10
votes

Une clause T-SQL conditionnelle est-elle possible?

Je veux utiliser de manière dynamique la top ou pas comme ça ...

SELECT @SomeNumber CASE WHERE 0 THEN TOP 5 COLUMNNAME
                        ELSE COLUMNNAME
                   END
FROM TABLE


0 commentaires

8 Réponses :


0
votes

Je ne pense pas que cela soit possible car top est appliqué non seulement une colonne mais toute la ligne. Vous devriez créer deux relevés de sélection différentes et les mettre dans un si sinon construire.


1 commentaires

Bien que la déclaration concernant le sommet applicable à une rangée entière non une colonne est correcte, cela peut être atteint! Voir la réponse de SPE109!



1
votes

Une réponse courte est non, pas la façon dont vous l'avez.

Vous pouvez cependant utiliser si pour tester et exécuter une requête différente: xxx


0 commentaires

2
votes

Je viens d'utiliser quelque chose comme ceci: - xxx


0 commentaires

1
votes

Deux options: SQL conditionnel SQL ou SQL dynamique.

(1) Conditionnel: P>

IF @SomeNumber = 0
    SELECT TOP 5 COLUMNAME FROM TABLE
ELSE
    SELECT COLUMNAME FROM TABLE


0 commentaires

7
votes

Je ne pense pas que vous puissiez.

Vous pouvez utiliser dynamique SQL: xxx

ou vous pouvez définir rowcount xxx


1 commentaires

Ceci a été utile et j'ai modifié un descs stockés à dynamiser en disant si @maxrows> 0 commencez RowCount @maxrows terminé , interrogation, puis réglage de RowCount vers 0 immédiatement après la requête.



20
votes

J'espère avoir compris votre problème: vous souhaitez sélectionner les 5 premières lignes si vous passez @somenenumber = 0 d'autre Sélectionnez toutes les lignes Etables

comme première mise en œuvre consécutive, vous pouvez faire quelque chose comme ça xxx

Vous pouvez modifier la valeur du paramètre afin d'avoir combien de lignes que vous souhaitez

sinon je vous suggère de mettre en œuvre une procédure stockée (et peut-être que vous Le fait, sinon vous pouvez suivre les étapes suivantes afin de le faire) xxx

alors vous pouvez appeler xxx

Je n'ai probablement pas répondu à votre question mais laissez-moi savoir si cela vous a aidé


1 commentaires

Sélectionnez Top (Select @SomenNumber) est parfait.



1
votes

Une autre échappatoire: utilisez la sous-requête avec la fonction Row_Number

DECLARE @DoTopJN AS bit

SET @DoTopJN = 0 -- or 1

SELECT X.Sequence
       X.COLUMNA
       --etc

FROM (SELECT ROW_NUMBER() OVER (ORDER BY Y.Code) AS Sequence
             ,Y.COLUMNA
             ,Y.COLUMNB
             -- etc.
      FROM   Y) X

WHERE ((@DoTopJN = 0) OR (X.Sequence = 1))  


0 commentaires

0
votes

Pour corriger le code de SPE109:

DECLARE @SomeNumber INT = 0
DECLARE @SQL nvarchar(max), @Params nvarchar(max)
set @Params = N''
SELECT @SQL = N'SELECT ' + CASE WHEN @SomeNumber = 0 THEN '' ELSE 'TOP ' + CAST(@SomeNumber as varchar) END + ' COLUMNNAME FROM TABLE'
exec sp_executesql @SQL, @Params


3 commentaires

Vous devez également commenter ci-dessous leur réponse ou poser une nouvelle question avec ce qui ne fonctionne pas avec leur solution pour vous (car cela était déjà marqué comme la réponse)


Je ne peux pas commenter ci-dessous leur réponse car cela nécessite que je dispose de 50 points de réputation malheureusement. Cependant, j'ai testé la "réponse acceptée" et produit un code SQL non valide (erreur de syntaxe).


La réponse acceptée produit ce code: Sélectionnez 5 cas où 0 TOP 5 TOP 5 ColumnName ElseName Fin de la table MSG 156, niveau 15, état 1, ligne 1 Syntaxe incorrecte près du mot-clé "cas".