2010-08-26 3 views
35

Est-il possible de combiner l'instruction CASE et l'opérateur LIKE dans une instruction MySQL SELECT? Par exemple, j'essaie d'interroger une base de données qui stocke des données dans une seule colonne dans l'un des deux formats (c'est horrible et me fait mal à la tête, mais je ne peux pas changer les données pour qu'elles soient ce qu'elles sont). . Donc parfois la colonne numbers aurait des données comme "6901xxxxxxxx" et parfois il aurait des données comme "91xxxxxxxxxxx".Cas MySQL dans l'instruction Select avec l'opérateur LIKE

Ce que je voudrais faire est interroger les données comme si -

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

Cela ne fonctionne évidemment pas, mais Im espérant son possible.

Répondre

68

Utilisation de la seconde forme de CASE devrait fonctionner:

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

De plus, vous avez une virgule parasite à la fin de votre SELECT.

+1

+1: Le format 'CASE colonne WHEN ...' est seulement bon pour les correspondances exactes; devez utiliser ce format pour des correspondances partielles. –

+2

Ding ding ding, mauvaise forme de cas. Merci beaucoup les gars, mon bureau/front sont reconnaissants. – HurnsMobile

+0

Merci. La syntaxe est précise –

6

Essayez

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: J'ai testé, cela fonctionne. MySQL ignore le "vrai"; Je pensais que cela déclencherait une erreur de syntaxe. Pourtant, je ne voudrais pas ajouter "vrai" là-bas si ce n'était pas nécessaire. –

+0

+1 pour le travail, pas tout à fait aussi bien que la réponse accpeted :) – HurnsMobile

4

Peut-être utiliser LEFT()?

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

Devrait être plus performant que le LIKE.

+0

Le LIKE dans cet exemple est seulement wildcarding le côté droit, donc un index pourrait être utilisé mais je ne crois pas que LEFT/INSTR pourrait utiliser un index. +1 pour une alternative –

0

Si l'on suppose le nombre de chiffres est constante, vous pouvez utiliser quelque chose comme ceci:

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

Ajouter 0 « s pour correspondre à votre nombre réel de chiffres.