2016-07-24 5 views
2

Ich habe eine Tabelle mit Daten. In dieser Tabelle befindet sich eine Spalte mit dem Namen "TypeTag", die entweder eine 11-stellige Nummer oder eine 11-stellige Nummer "_" gefolgt von 3 weiteren Ziffern sein kann. Bedeutung: 'XXXXXXXXXXX' ODER 'XXXXXXXXXXX_XXX'. nurVerwenden von "LIKE" in "SELECT CASE" funktioniert nicht - mysql

Ich brauche den ersten Teil - so schrieb ich eine Abfrage:

SELECT 
    (CASE 
      WHEN TypeTag LIKE '%_%' THEN LEFT(TypeTag, LENGTH(TypeTag) - 4) 
      ELSE TypeTag 
    END) 
FROM `DailyReport` 
WHERE DATE>='2016-07-01' 

Das Problem ist, dass alle Werte ohne ihre letzten vier Zeichen zurückkehren, scheint nicht der Fall zu arbeiten (oder vielleicht die LIKE funktioniert nicht), weil alle Datensätze in das erste "WHEN" und nicht in "ELSE" gehen.

Zum Beispiel, wenn meine ursprüngliche Datensatz ist:

56329856721 
56329856722_502 
56329856723 
56329856724 
56329856725_633 
56329856726 

Dann ist die Antwort, die ich bekommen ist:

5632985 
56329856722 
5632985 
5632985 
56329856725 
5632985 

Ich verwende MySQL (SQLyog speziell). Weiß jemand, was mit meiner Frage nicht stimmt? oder wie schreibe ich die Bedingung so, dass ich das gewünschte Ergebnis bekomme?

Danke euch allen !!

+0

Ich verstehe die Notwendigkeit für die Fallaussage überhaupt nicht hier. Was stimmt nicht mit Auswahl links (TypeTag, 11) von ...? –

Antwort

5

Das ist Ihre CASE Aussage:

(CASE WHEN TypeTag LIKE '%_%' THEN LEFT(TypeTag, LENGTH(TypeTag) - 4) 
     ELSE TypeTag 
END) 

Sie haben vergessen, dass _ ist ein Platzhalter (das entspricht genau ein Zeichen). So überprüft der LIKE, dass der Wert mindestens ein Zeichen hat.

Sie können entkommen:

(CASE WHEN TypeTag LIKE '%\_%' THEN LEFT(TypeTag, LENGTH(TypeTag) - 4) 
     ELSE TypeTag 
END) 

Oder, wenn Sie nicht \ als Escape-Zeichen mögen, können Sie definieren Ihre eigenen:

(CASE WHEN TypeTag LIKE '%!_%' ESCAPE '!' THEN LEFT(TypeTag, LENGTH(TypeTag) - 4) 
     ELSE TypeTag 
END) 

Oder können Sie den gesamten vereinfachen Logik von SUBSTRING_INDEX() mit:

SUBSTRING_INDEX(TypeTag, '_', 1) 

Das ist mein preferr wäre ed Lösung.

+0

Ich kann nicht glauben, dass ich bei all meinen Suchen die Funktion "SUBSTRING_INDEX" nicht gefunden habe - Danke !!!! – Bramat