2010-07-28 18 views
6

Powiedzmy mam następujące proste zapytaniewynik Konwersja ciągu rachunku

SELECT TOP 1 name FROM months 

która zwraca name = „marsz”. Czy jest możliwe przekonwertowanie tego wyniku? Zamiast "marszu" chcę nazwę = "3". Czy SQL jest w stanie robić takie rzeczy? Używam bazy danych MSSQL.

[aktualizacja] Poprawiono zapytanie. Podczas pisania tego prostego przykładu I miesza się go z MySQL [/ Update]

+0

Co robi 'kolumny tabeli months' mieć? –

+1

LIMIT nie ma znaczenia w serwerze MS Sql. Myślę, że się mylisz. –

+1

'LIMIT' nie jest poprawnym T-SQL i nie jest zrozumiany przez SQL-Server. Jest to konstrukcja MySql. – Oded

Odpowiedz

3

Jeśli chcesz zmapować stały zestaw wartości wejściowych przed ustalonym zestawem wartości wyjściowych, CASE WHEN jest twoim przyjacielem:

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

PS: Jest to standardowe systax SQL, które będzie działać w różnych silnikach baz danych. – Tomalak

3

Jeśli chcesz po prostu numer miesiąca, można to zrobić:

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

W Oracle używamy rozszyfrować. Ale myślę, że w SQL Server musisz iść z CASE. Przykład:

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

można również użyć CASE w Oracle, jest bardziej czytelny. – mcha

+0

Mogę się z tym zgodzić. CASE jest bardziej czytelny niż DECODE. W rzeczywistości najlepszym rozwiązaniem byłby JOIN lub SUB-SELECT z "tablicą kontrolną". To zapobiega kodowaniu. Ale w konkretnym przypadku może to być nawet problem z formatowaniem danych, jak sądzę z innych głosujących odpowiedzi. – hol

2

Jeśli jesteś naprawdę za pomocą serwera SQL, ty może próbować następujące

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

Ale jak mówili inni, używanie słowa kluczowego LIMIT sugeruje może być na innym RDBMS

+0

Ponadto, dla zaledwie dwunastu przewidywalnych wartości, budowanie ciągu, odlewanie go do 'DATETIME', a następnie przekazywanie przez' MIESIĄC() 'będzie zdecydowanie wolniejsze niż' CASE WHEN', i będzie wybuchać, gdy jest miesiąc z literówką. – Tomalak

0

Myślę, że najlepsze, co będziesz w stanie zrobić, to zdanie CASE.

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

Tylko dla odmiany

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

może chcieć dodać LOWER przed nazwą i łańcuchem wyszukiwania - oryginalne pytanie Nicka oparte było na wartości "marsz". –

+0

@Mark - W tym celu użyłem polecenia 'COLLATE'. –

+0

+1 za oryginalność – Heinzi

1

Spróbuj użyć funkcji konwersji SQLSERVER daty, na przykład tak:

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