2010-04-01 6 views
10

Je me demande si l'utilisation d'une instruction CASE dans SQLite (ou d'autres moteurs SQL) pour remplacer des données n'est pas conseillée. Par exemple, disons que j'ai une requête.SQLite est l'instruction CASE chère?

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; 

Quand est-il préférable de créer une table de référence et d'effectuer un JOIN. Dans ce cas, je créer une table 'ActiveStatesTable' avec ActiveID, ActiveDescription et effectuer le JOIN.

Répondre

11

L'instruction CASE est préféré syntaxe:

  • Il est ANSI (92?), Il est donc pris en charge sur MySQL, Oracle, SQL Server, Postgres ... contrairement à la base de données fournisseur spécifique si la syntaxe
  • Il prend en charge court circuit - le reste de l'évaluation n'est pas effectué une fois que le critère correspond
+2

La taille de l'instruction CASE doit-elle être prise en compte? Que se passe-t-il si une colonne "Description ID" se trouve dans la table, et qu'il y a des centaines de descriptions à cartographier? – galford13x

3

Faire la table séparée et JOIN est certainement la manière la plus propre d'écrire ce code. Que se passe-t-il, par exemple, si vous voulez écrire une autre requête avec les mêmes mappages? Vous devez copier l'instruction CASE dans la nouvelle requête, et la copie est mauvaise. Que se passe-t-il si vous devez ajouter un nouvel état Actif?

En ce qui concerne les performances, le JOIN et le CASE devraient être assez bon marché. CASE pourrait être légèrement plus performant en raison du court-circuit de l'évaluation et des quelques cas, mais JOIN est, à mon avis, la solution la plus propre et la plus flexible et la plus transparente.

+0

Cela est vrai, mais maintenir le CASE ne sera pas trop difficile car je pourrais simplement créer une vue avec qui a le cas, puis maintenir la vue. – galford13x

3

CASE devrait être beaucoup moins cher car il ne devrait pas impliquer d'E/S, mais pour les petites tables JOINs ne sont pas si cher non plus (mais le tester).

La question est de savoir si vous aurez besoin de maintenir ce CAS dans plusieurs requêtes et devrez-vous établir une intégrité référentielle.

+0

Ceci est vrai, mais maintenir le CASE ne sera pas trop difficile car je pourrais juste créer une vue avec qui a le cas, puis maintenir la vue. – galford13x

+0

Il pourrait être facile pour un petit nombre de cas et comme une exception, mais il devrait toujours être considéré. Si vous ne tenez pas compte de l'intégrité, la conserver dans une vue n'est pas la même chose que la conserver dans une table (vous ne pouvez pas mettre à jour la traduction en fonction d'une requête). – Unreason

+0

Cela a du sens. Je vais ajouter une table et effectuer quelques benchmarks. Je posterai les résultats quand j'aurai fini. – galford13x