2010-04-01 12 views
10

Zastanawiam się, czy za pomocą instrukcji CASE w SQLite (lub innych silników SQL) w celu zastąpienia danych nie jest zalecane. Na przykład powiedzmy, że mam zapytanie.SQLite to instrukcja CASE droga?

SELECT Users, 
       CASE WHEN Active = 0 THEN 'Inactive' 
         WHEN Active = 1 THEN 'Active' 
         WHEN Active = 2 THEN 'Processing' 
         ELSE 'ERROR' END AS Active 
FROM UsersTable; 

Kiedy lepiej utworzyć tabelę odniesienia i wykonać JOIN. W tym przypadku utworzyłbym tabelę "ActiveStatesTable" z ActiveID, ActiveDescription i wykonam JOIN.

Odpowiedz

11

Oświadczenie CASE jest korzystne składnia:

  • To ANSI (92?), Więc jest obsługiwana w MySQL, Oracle, SQL Server, PostgreSQL ... w odróżnieniu od dostawcy bazy danych określonej IF składnia
  • Wspiera Short Ciruiting - reszta oceny nie jest wykonywana po dopasowaniu kryteriów
+2

Gdyby wielkości instrukcji CASE uznać? Co się stanie, jeśli w tabeli znajduje się kolumna "Identyfikator opisu", a istnieje 100 opisów do mapowania? – galford13x

3

Wykonanie oddzielnej tabeli i JOIN jest zdecydowanie czystszym sposobem napisania tego kodu. Co się dzieje, na przykład, jeśli chcesz napisać kolejne zapytanie z tymi samymi mapowaniami? Musisz skopiować instrukcję CASE do nowego zapytania, a kopiowanie jest złe. Co się stanie, jeśli musisz dodać nowy stan aktywny?

Performance-mądry, zarówno JOIN i sprawa powinna być dość tanie. CASE może być nieco bardziej wydajne ze względu na zwarcie oceny i kilka przypadków, ale JOIN jest, moim zdaniem, czystsze i bardziej elastyczne i bardziej SQL-ey rozwiązanie.

+0

To prawda, ale zachowanie CASE nie będzie zbyt trudne, ponieważ mogę po prostu stworzyć WIDOK z tym, który ma CASE, a następnie zachować VIEW. – galford13x

3

sprawa powinna być znacznie tańsze, ponieważ nie powinna obejmować dowolny I/O, ale dla małych tabel JOIN że nie są drogie (ale zrobić go przetestować).

Pytanie brzmi, czy trzeba będzie utrzymać ten przypadek, w wielu zapytań i trzeba będzie nawiązać żadnego więzów integralności na nim.

+0

To prawda, ale zachowanie CASE nie będzie zbyt trudne, ponieważ mogę po prostu stworzyć WIDOK z tym, który ma PRZYPADEK, a następnie zachować WIDOK. – galford13x

+0

Może to być łatwe dla niewielkiej liczby przypadków i jako wyjątek, ale nadal należy wziąć pod uwagę. Nie zważając na integralność, utrzymywanie go w widoku nie jest tym samym, co utrzymywanie go w tabeli (nie można aktualizować tłumaczenia na podstawie zapytania). – Unreason

+0

To ma sens. Dodam tabelę i wykonam kilka testów. Będę wysyłać wyniki, gdy skończę. – galford13x