2010-04-01 19 views
10

Me pregunto si no se recomienda usar una instrucción CASE en SQLite (u otros motores SQL) para reemplazar datos. Por ejemplo, digamos que tengo una consulta.SQLite es la sentencia CASE costosa?

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; 

Cuándo es mejor crear una tabla de referencia y realizar un JOIN. En este caso, crearía una tabla 'ActiveStatesTable' con ActiveID, ActiveDescription y realizaría el JOIN. sintaxis

Respuesta

11

Se prefiere la instrucción CASE:

  • Es ANSI (92?), por lo que se admite en MySQL, Oracle, SQL Server, PostgreSQL ... a diferencia de proveedor de base de datos específica si la sintaxis
  • Es compatible operación corta - el resto de la evaluación no se realiza una vez que los criterios coinciden con
+2

¿Se debe considerar el tamaño de la sentencia CASE? ¿Qué sucede si una columna 'Descripción ID' está en la tabla, y hay 100 descripciones para mapear? – galford13x

3

Hacer la tabla por separado y JOIN es definitivamente la manera más limpia de escribir este código. ¿Qué ocurre, por ejemplo, si desea escribir otra consulta con las mismas asignaciones? Tendría que copiar la instrucción CASE en la nueva consulta y copiar la duplicación es incorrecta. ¿Qué sucede si necesita agregar un nuevo estado Activo?

En cuanto a rendimiento, tanto el JOIN como el CASE deberían ser bastante baratos. CASE podría ser un poco más eficiente debido al cortocircuito de la evaluación y los pocos casos, pero JOIN es, en mi opinión, la solución más limpia y flexible y más SQL-ey.

+0

Esto es cierto, pero mantener el CASO no será demasiado difícil, ya que podría crear una VISTA con el CASO y luego mantener la VISTA. – galford13x

3

CASE debería ser mucho más económico, ya que no debería implicar ninguna E/S, pero para las tablas pequeñas, las UNIONES tampoco son tan caras (pero sí pruébelas).

La pregunta es si necesitará mantener este CASO en varias consultas y tendrá que establecer cualquier integridad referencial en él.

+0

Esto es cierto, pero mantener el CASE no será demasiado difícil, ya que podría crear una VISTA con el CASO y luego mantener la VISTA. – galford13x

+0

Podría ser fácil para un número pequeño de casos y como excepción, pero aún debe considerarse. Sin tener en cuenta la integridad, mantenerla en una vista no es lo mismo que mantenerla en una tabla (no puede actualizar la traducción en función de una consulta). – Unreason

+0

Eso tiene sentido. Agregaré una tabla y realizaré algunos puntos de referencia. Publicaré resultados cuando haya terminado. – galford13x

Cuestiones relacionadas