2010-05-13 12 views
2

Je veux faire une sélection qui fait un cast uniquement pour un ID spécifique mais cela ne semble pas fonctionner.SQL Server, Select CASE avec différents cast

Exemple:

SELECT 
    CASE 
    WHEN(@ID <> 1) THEN Code 
    WHEN(@ID = 1) THEN Cast(Code AS int) 
    END Code FROM .... 

Toute idée?

+0

Quelle est l'erreur? – hgulyan

+0

Je reçois toujours l'erreur: La conversion a échoué lors de la conversion de la valeur nvarchar 'ASS2902' en type de données int même si @ID = 2 mais je veux juste faire le casting pour @ID = 1 – Mathieu

+0

Il essayera de lancer quand même. Vérifiez la mise à jour dans ma réponse. – hgulyan

Répondre

1

Cela fonctionne pour moi. Vérifiez si le @id est de type int et si toutes les valeurs de la colonne Code peuvent être castées en int.

MISE À JOUR Si vous avez une valeur qui ne peut pas être convertie en int, votre requête ne fonctionnera pas.

Vous pouvez donc écrire 2 requêtes différentes.

Smth comme

IF @id = 1 THEN 
SELECT code ... 
ELSE 
SELECT Cast(Code AS int) as Code 
+0

C'est le nom de la colonne de sortie. Il devrait y avoir un 'AS' avant. –

+0

C'est bon. mon erreur. Cela fonctionne sans AS. – hgulyan

+0

@Marcelo le 'as 'n'est pas obligatoire. – Blorgbeard

2

Pourquoi ne veulent le faire? Une expression SQL Server a un type fixe unique. En d'autres termes, une seule expression ne peut pas être varchar(50) ou int en fonction de la façon dont l'expression est évaluée. Vous pouvez placer chaque cas à sql_variant, mais cela peut ou non avoir un sens en fonction de ce que vous essayez de faire.

EDIT

Si vous exécutez cette requête à partir d'une procédure stockée, vous pouvez créer un bloc if..else pour exécuter une version différente de la requête basée sur la valeur de @ID. Par exemple:

IF (@ID = 1) BEGIN 
    SELECT Cast(Code AS int) AS Code FROM ... 
END 
ELSE BEGIN 
    SELECT Code FROM ... 
END 
+0

+1, pour un 'CASE 'donné, tous ses' WHEN' et 'ELSE' doivent retourner le même type de données. –

+0

C'est parce que le 'Employee Code' est un nvarchar dans le BD mais un de mes utilisateurs utilise le code 'Employee Code' mais ils sont en magasin sont nvarchar et maintenant il aimerait voir ses employés passer par 'Employee Code' mais quand vous trier par "code employé" c'est un ordre alphabétique. Donc, pour cet utilisateur précis, je veux commander numériquement. Peut-être qu'il existe une meilleure solution .... – Mathieu

+0

@KM Ok merci! – Mathieu

0

Vous auriez pu également écrit:

select case when @ID = 1 then CAST(Code as int) else Code end as Code 
    from... 

Par ailleurs, les données contenant des caractères alphabétiques ne rejettera int.

Peut-être pourrions-nous mieux vous aider si vous nous dites ce que vous voulez accomplir, avec quelques exemples de données fournis?

+0

Comme je l'ai mentionné dans un commentaire précédent, toute l'expression CAST doit avoir un seul type. Étant donné que la première alternative de l'expression CAST a ici le type 'int', SQL Server convertira implicitement toutes les alternatives suivantes en int. Même lorsque @ID n'est pas 1, toutes les valeurs de 'Code' seront converties en 'int' et toutes les valeurs de 'Code' qui ne peuvent pas être converties en 'int' provoqueront une erreur. –