2010-08-26 14 views
35

¿Es posible combinar la instrucción CASE y el operador LIKE en una declaración MySQL SELECT?Caso de MySQL en la instrucción Select con el operador LIKE

Por ejemplo, estoy tratando de consultar una base de datos que almacena datos en una sola columna en cualquiera de los dos formatos (esto es horrible y me duele, pero no puedo cambiar los datos por lo que es). . Por lo tanto, a veces la columna numbers tendría datos como "6901xxxxxxxx" y en ocasiones podría contener datos como "91xxxxxxxxxxx".

Lo que me gustaría hacer es consultar los datos como tal -

SELECT 
    CASE digits 
     WHEN LIKE "6901%" THEN substr(digits,4) 
     WHEN LIKE "91%" THEN substr(digits,2) 
    END as "digits", 
FROM raw 

Obviamente, esto no funciona, pero estoy esperando su posible.

Respuesta

68

Uso de la segunda forma de CASE debería funcionar:

SELECT 
    CASE 
    WHEN digits LIKE '6901%' THEN substr(digits,4) 
    WHEN digits LIKE '91%' THEN substr(digits,2) 
    END as digits 
FROM raw 

Además, tiene una coma perdida al final de su SELECT.

+1

+1: 'columna CASE CUANDO ...' el formato solo sirve para coincidencias exactas; tiene que usar este formato para las coincidencias parciales. –

+2

Ding ding ding, forma incorrecta de la caja. Gracias muchachos, mi escritorio/frente están agradecidos. – HurnsMobile

+0

Gracias. La sintaxis es precisa –

6

Trate

SELECT 
    CASE true 
     WHEN digits LIKE "6901%" THEN substr(digits,4) 
     WHEN digits LIKE "91%" THEN substr(digits,2) 
    END as "digits", 
FROM raw 
+1

+1: He probado, esto funciona. MySQL ignora el "verdadero"; Pensé que desencadenaría un error de sintaxis. Aún así, no agregaría "verdadero" allí si no fuera necesario. –

+0

+1 para el trabajo, no tan bien como la respuesta aceptada :) – HurnsMobile

4

¿Quizás use LEFT()?

SELECT 
    CASE 
     WHEN LEFT(digits, 4) = '6901' THEN substr(digits,4) 
     WHEN LEFT(digits, 2) = '91' THEN substr(digits,2) 
    END 
FROM raw 

Debe ser más eficiente que el LIKE.

+0

El LIKE en este ejemplo es wildcarding el lado derecho, por lo que un índice podría ser utilizado, pero no creo que IZQUIERDA/INSTR podría utilizar un índice. +1 por una alternativa. –

0

Suponiendo que el número de dígitos es constante, se puede usar algo como esto:

SELECT IF(digits > 919999, MOD(digits, 100), MOD(digits, 10000) FROM raw 

Añadir 0 's para que coincida con el número real de dígitos.

Cuestiones relacionadas