MySql IF in WHERE

Status
Dieses Thema wurde gelöst! Zur Lösung gehen…

Sprint

Erfahrenes Mitglied
Hallo zusammen,

das aktuelle Projekt läuft inzwischen länger als erwartet und nun kommen wir demnächst zu dem Zeitpunkt, an dem aus 5-stelligen Kundennummern 6-stellige werden. Die wurden ursprünglich mit 50000 gestartet, so daß alle, die mit 1-4 anfangen, die 6-stelligen sind. Das muß ich aber jetzt in eine DB Abfrage einbringen. Bisher sah die so aus:

SQL:
SELECT k.kdnr AS kdid,
       p.vknr AS kdnr
FROM   pruefvk p,
       kunden k
WHERE  p.email = '$username'
       AND p.geloescht = '0'
       AND k.kdmerkmal = 6
       AND Substr(p.vknr, 1, 5) = k.kdnr
In Pseudocode müßte das also in Zukunft so aussehen:
SQL:
SELECT k.kdnr AS kdid,
       p.vknr AS kdnr
FROM   pruefvk p,
       kunden k
WHERE  p.email = '$username'
       AND p.geloescht = '0'
       AND k.kdmerkmal = 6
       AND
           IF (Substr(p.vknr, 1, 1) >= 5)
               substr(p.vknr,1,5) = k.kdnr
           ELSE
               substr(p.vknr,1,6) = k.kdnr
Das funktioniert aber nicht. Ich habe auch schon mit CASE gespielt, bekam aber auch da immer jede Menge Fehlermeldungen.

Gibt es eine Lösung dafür?
 

Yaslaw

alter Rempler
Moderator
Hat das Feld p.vknr noch andere Infos drin als die k.kdnr? Oder warum schneidest du da ein Teilstring raus?
Wenn ja, machst du später das Chaos perfekt, indem du p.vknr zu kdnr umbenennst. Entweder ist es das gleiche, dann heisst es auch gleich, oder es sind verschiedene Inhalte mit verschiedenen Namen.
In einer DB sollte man nie mehr als eine Info in ein Feld schreiben.


Die folgenden Zeilen solltest du nur beachten, wenn du die DB nicht sauber anpassen darfst. Ansosnten, bereinige pruefvk.

SQL:
AND (
    (Substr(p.vknr, 1, 1) >= 5 AND substr(p.vknr,1,5) = k.kdnr)
    OR (Substr(p.vknr, 1, 1) < 5 AND substr(p.vknr,1,6) = k.kdnr)
)
-- oder
AND substr(p.vknr, 1, IF(Substr(p.vknr, 1, 1) >= 5, 5, 6)) = k.kdnr
-- oder
AND substr(p.vknr, 1, CASE WHEN Substr(p.vknr, 1, 1) >= 5 THEN 5 ELSE 6) = k.kdnr

Schöner wäre es, das Ding vorher zu zerlegen
SQL:
SELECT 
    k.kdnr AS kdid, 
    p.vknr AS kdnr
FROM
    (
        SELECT vknr, substr(p.vknr, 1, IF(Substr(p.vknr, 1, 1) >= 5, 5, 6)) AS vkdnr_1
        FROM pruefvk 
    )p,
      kunden k
WHERE
    p.email = '$username'
    AND p.geloescht = '0'
    AND k.kdmerkmal = 6
    AND p.vkdnr_1 = k.kdnr

Noch besser wäre, den Subselect in eine View auszulagern, damit du nicht überall diesen Blödsinn einprogrammieren musst
 

Sprint

Erfahrenes Mitglied
Danke erstmal für deine Hilfe!

Die Benennung ist in der Tat unsinnig, das muß ich ändern. Aber das Paket, auf das das aufbaut ist uralt und leider nicht mehr änderbar.

Die vknr ist eine Personalnummer, bei der einfach eine laufende Nummer an die Kundennummer angehängt wurde. Aber jetzt, wo ich diesen Satz schreibe, fällt mir ein, daß man das auch mit einem LIKE machen könnte. Würde das wenigstens etwas einfacher machen.
 
Status
Dieses Thema wurde gelöst! Zur Lösung gehen…