2010-11-02 21 views
1

J'ai une table A et si les paramètres @x est 0 je veux commander A par date, sinon par nom. Voici un exemple:SQL - ORDER BY dans IF-ELSE CLAUSE

declare @x int set @x = 0 
if(@x=0)(
SELECT * FROM A 
order by DATE 
) 
else 
(
SELECT * FROM A 
order by Name 
) 

Quand essayer de le faire retour SQL Server 2 d'erreur egual comme

syntaxe incorrecte près du mot-clé « pour ».

Que puis-je faire?

Répondre

1
declare @x int set @x = 0 
if(@x=0) 
begin 
SELECT * FROM A 
order by DATE 
end 
else 
begin 
SELECT * FROM A 
order by Name 
end 
1
SELECT 
    * 
FROM 
    A 
ORDER BY 
    CASE WHEN @x = 0 THEN Date ELSE Name END 
+1

Je ne suis pas sûr qu'il fonctionnera, en supposant que 'Date' est de type date et le nom est le type de chaîne. La conversion en variante aiderait, mais cela pourrait affecter (en mauvais) l'utilisation de l'index. –

0

Si votre requête devient raisonnablement complexe, puis le copier dans les deux côtés d'un IF/ELSE peut devient assez lourde. Vous pouvez à la place utiliser une expression CASE dans votre ORDER BY. Dans ce cas, vous pourriez faire:

SELECT * FROM A ORDER BY CASE WHEN @x=0 THEN DATE END, CASE WHEN @x<>0 THEN Name END 

Ceci peut être étendu à plusieurs conditions/colonnes. Vous devez juste vous assurer que chaque expression CASE renvoie un type de données sensible.

2

Essayez plutôt

SELECT * FROM A 
order by 
Case @x When 0 Then Cast(DATE as sql_variant) Else Name End 

La coulée est nécessaire pour le genre de travail dynamique avec une date - je suis en train de trouver une référence, mais vous avez besoin d'un type qui peut être casté automatiquement à une commune tapez, et la date ne peut pas être faite. Par conséquent, vous lancer.

Voici un lien vers certaines options. Notez la section sur les types de données mixtes.

http://www.4guysfromrolla.com/webtech/010704-1.shtml

0

Parenthèses( et )sont mal. Utilisez BEGIN et END à la place.

DECLARE @x INT 
SET @x = 0 

IF (@x = 0) BEGIN 
    SELECT * FROM A ORDER BY DATE 
END 
ELSE BEGIN 
    SELECT * FROM A ORDER BY Name 
END 

De plus, à mon avis, comme DATEnom de la colonne estpas une bonne idée.

0

Comme indiqué dans les réponses mais non expliqué.

SQL utilise BEGIN - syntaxe END au lieu de() ou {} pour le bloc de commandes