2010-08-26 8 views
35

Ist es möglich, die CASE Anweisung und den LIKE Operator in einer MySQL SELECT Anweisung zu kombinieren?MySQL Case in Select-Anweisung mit LIKE-Operator

Zum Beispiel versuche ich eine Datenbank abzufragen, die Daten in einer einzigen Spalte in einem von zwei Formaten speichert (das ist schrecklich und tut meinem Kopf weh, aber ich kann die Daten nicht ändern, also ist es das, was es ist.) . Manchmal hätte die Spalte numbers Daten wie "6901xxxxxxxx" und manchmal hätte sie Daten wie "91xxxxxxxxxxx".

Was Ich mag würde, ist zu tun, um die Daten abfragen, wie so -

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

Das ist offensichtlich nicht funktioniert aber ich bin der Hoffnung, das ist möglich.

Antwort

68

sollte die zweite Form der CASE Verwendung arbeiten:

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

Des Weiteren Sie am Ende Ihres SELECT ein Streu Komma haben.

+1

+1: 'CASE Spalte WHEN ...' Format ist nur gut für genaue Übereinstimmungen; muss dieses Format für teilweise Übereinstimmungen verwenden. –

+2

Ding Ding, falsche Form des Falles. Vielen Dank Jungs, mein Schreibtisch/Stirn sind dankbar. – HurnsMobile

+0

Danke. Die Syntax ist genau –

6

Versuchen

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: Ich habe getestet, das funktioniert. MySQL ignoriert das "Wahr"; Ich dachte, es würde einen Syntaxfehler auslösen. Trotzdem würde ich dort nicht "wahr" hinzufügen, wenn es nicht nötig wäre. –

+0

+1 für die Arbeit, nicht ganz so gut wie die Antwort auf die Antwort :) – HurnsMobile

4

Vielleicht verwenden Sie LEFT()?

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

Sollte leistungsfähiger sein als die LIKE.

+0

Die LIKE in diesem Beispiel ist nur die rechte Seite, so dass ein Index verwendet werden könnte, aber ich glaube nicht, dass LEFT/INSTR einen Index verwenden könnte. +1 für eine Alternative. –

0

die Anzahl der Ziffern ist konstant Unter der Annahme, könnten Sie so etwas wie folgt verwenden:

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

0 ‚s Fügen Sie Ihre tatsächliche Anzahl der Ziffern übereinstimmen.