2010-07-28 6 views
6

Disons que j'ai la requête simple suivanterésultat Convert figurant dans la déclaration

SELECT TOP 1 name FROM months 

qui retourne name = "mars". Est-il possible de convertir ce résultat? Au lieu de "mars" je veux nommer "3". SQL est-il capable de faire de telles choses? J'utilise une base de données MSSQL.

[mise à jour] Correction de la requête. En écrivant cet exemple simple, je mélangeaient avec MySQL [/ mise à jour]

+0

les colonnes ne la table 'months' ont? –

+1

LIMIT n'a aucune signification dans le serveur MS Sql. Je pense que tu te trompes. –

+1

'LIMIT' n'est pas valide T-SQL et n'est pas compris par SQL-Server. C'est une construction MySql. – Oded

Répondre

3

Si vous souhaitez mapper un ensemble fixe de valeurs d'entrée sur un ensemble fixe de valeurs de sortie, CASE WHEN est votre ami:

SELECT 
    CASE name 
    WHEN 'january' THEN 1 
    WHEN 'february' THEN 2 
    WHEN 'march' THEN 3 
    /* ... */ 
    END as num 
FROM 
    months 
+0

PS: Ceci est un systax SQL standard qui fonctionnera sur différents moteurs DB. – Tomalak

3

Si vous voulez juste nombre de mois, vous pouvez le faire:

SELECT 
    CASE 
     WHEN name = 'January' then 1 
     WHEN name = 'February' then 2 
     WHEN name = 'March' then 3 
     WHEN name = 'April' then 4 
     WHEN name = 'May' then 5 
     WHEN name = 'June' then 6 
     WHEN name = 'July' then 7 
     WHEN name = 'August' then 8 
     WHEN name = 'September' then 9 
     WHEN name = 'October' then 10 
     WHEN name = 'November' then 11 
     WHEN name = 'December' then 12 
    END month_num 
FROM months 
1

Dans Oracle, nous utilisons DECODE. Mais je pense que dans SQL Server, vous devez aller avec CASE. Exemple:

SELECT CASE WHEN name = 'March' THEN '3' 
      WHEN name = 'April' THEN '4' 
      ELSE 'something else' 
     END 
FROM months 
+1

vous pouvez également utiliser CASE dans Oracle, c'est plus lisible. – mcha

+0

Je peux être d'accord avec ça. CASE est plus lisible que DECODE. En fait, le meilleur serait un JOIN ou un SUB-SELECT avec une "table de recherche". Cela empêche le codage en dur. Mais dans un cas spécifique, il pourrait même s'agir d'un problème de formatage des données, comme je le juge d'après d'autres réponses votées. – hol

2

Si vous utilisez vraiment SQL Server, vous pourrait essayer ce qui suit

SELECT TOP 1 MONTH(CAST('01 ' + name + ' 2000' AS DATETIME)) 
FROM months 

Mais comme d'autres l'ont dit, votre utilisation du mot-clé LIMIT suggère que vous pourriez être sur une autre SGBDR

+0

De plus, pour seulement douze valeurs prévisibles, construire une chaîne, la convertir en 'DATETIME' et la passer à' MONTH() 'sera certainement plus lente que' CASE WHEN', et elle explosera quand il y a un mois avec une faute de frappe dedans. – Tomalak

0

Je pense que le mieux que vous puissiez faire est une instruction CASE.

select case name 
      when 'January' then 1 
      when 'February' then 2 
      ... 
      when 'December' then 12 
     end as MonthNumber 
    from months 
1

Juste pour la variété

SELECT 
CEILING(CHARINDEX(name,'January February March  April  May  June  July  August September October November December' 
COLLATE sql_latin1_general_cp1_ci_as)/10.0) 
month_num 
FROM months 
+0

pourrait vouloir ajouter LOWER devant le nom et la chaîne de recherche - la question originale de Nick était basée sur la valeur 'mars'. –

+0

@Mark - J'ai lancé un 'COLLATE' pour y faire face. –

+0

+1 pour l'originalité – Heinzi

1

Essayez d'utiliser les fonctions de conversion de date de SQLServer, comme ceci:

select TOP 1 datepart(month,convert(datetime, left(name,3) + ' 01, 01', 107)) 
FROM months