2010-11-14 73 views
7

No estoy seguro de cuán lejos puede llegar una consulta SQL con sentencias if/else.mysql IF Else Statement

que tienen un simple instrucción SELECT:

SELECT amount, transtype DE transactions

La columna transtype va a ser un número.

Por ejemplo, 1 = venta, 2 = reembolso, 3 = error, 4 = cancelado, 5 = algo más ... y así sucesivamente.

Por lo tanto, nada complicado. Pero la lista tiende a crecer por razones de informes. Lo cual está bien.

Para una consulta específica en la que estoy trabajando, ¿hay alguna manera de extraer esa columna como uno de los dos o tres números o texto especificados?

Por ejemplo, algunos números de transtype son una "pérdida", mientras que otros son una "ganancia", y tal vez otros son "neutrales".

Me gustaría extraer esa columna solo con esos 3, sin usar php dentro de la tabla html en la que estoy arrojando las filas.

Si mi explicación no está clara, mis disculpas. Fue difícil escupir.

+0

¿Desea categorizar sus valores de transtipo como pérdida, ganancia o neutral? –

Respuesta

3

Utilice la función MySQL CASE() para un número fijo de argumentos. Si la lista se está volviendo grande, debería usar una segunda tabla y unirlos.

Ejemplo:

SELECT CASE WHEN 1>0 THEN 'true' ELSE 'false' END; 
2

Intenta unir contra otra tabla que contenga los tipos de transacción. Algo así como:

TRANSACTION_TYPES 
transtype | number 
label  | varchar(32) 

A continuación, modificar su consulta para incluir la unión:

select t.amount, t.transtype, l.label 
    from transactions.t 
    join transaction_types l on t.transtype = l.transtype; 
+0

Estaba tratando de mantenerme alejado de la mesa extra. No preveo que el transtipo tenga más de 10 números. Pero tienes razón, esa es una solución rápida. – coffeemonitor

+0

También preservará la integridad relacional de la base de datos, para que pueda darle sentido sin la consulta específica para "explicar" sus números mágicos por usted. –

0

La función ELT debe hacer el truco:

SELECT ELT(`transtype`, 'loss', 'loss', 'gain', 'neutral', …) FROM … 
No

muy elegante sin embargo, y lógicamente me gustaría hacer esto en la lógica de la vista, no la lógica de la base de datos.

0

Probablemente deberías usar ENUM type para esa columna. Está limitado a 64 valores, sin embargo, si necesita más, debe crear una nueva tabla y JOIN en la consulta.