datadexx
Goto Top

MySQL IF Abfrage

Hallo Leutz,

ich hab wieder ein Problem mit einer MySQL Abfrage.

Ich möchte in einer Abfrage prüfen ob ein Feld leer ist (also '') und wenn es leer ist soll eine Abfrage von anderen Feldern durchgeführt werden. Ist es nicht leer sollen die Abfrage nicht ausgeführt werden. Die Abfrage hat auch noch nen Join.

Ein Beispiel:

SELECT xy,
CONCAT( xyz,WENN XYZ ='' abz,dfg abfragen sonst abz,dfg nicht abfragen und weiter machen),
txt,
sbs

FROM tabelle LEFT JOIN bla bla usw.
WHERE dies und das

Keinen Plan wie ich das machen soll.

Danke für Hilfe!!!!

Greetz

Content-Key: 203680

Url: https://administrator.de/contentid/203680

Printed on: April 25, 2024 at 12:04 o'clock

Member: LianenSchwinger
LianenSchwinger Mar 20, 2013 at 19:29:17 (UTC)
Goto Top
Hallo,

um zu prüfen, ob ein Feld leer ist bedient man sich des NULL-Operators.
In Deinem Fall ohne viel bla bla:

xyz IS NULL

G Jörg
Member: filippg
filippg Mar 20, 2013 at 19:36:55 (UTC)
Goto Top
Hallo,

okay - und wo ist jetzt die Frage?
Bei Problemen bei der Verwendung der IF-Funktion würde ich die Referenz empfehlen:
http://dev.mysql.com/doc/refman/5.1/de/control-flow-functions.html

Auf NULL hat Jörg schon hingewiesen - aus Sicht einer DB gibt es "" (leere Zeichenkette) und NULL (kein Wert definiert).

Gruß

Filipp
Member: datadexx
datadexx Mar 20, 2013 at 19:43:25 (UTC)
Goto Top
Hab ich probiert, geht nicht. Das Problem ist das ich eine rückwärts Kompatibilität zu alten Daten benötige. Da gibt es das Feld Ladung in den alten Daten, welches durch die neuen inserts nicht mehr befüllt wird und somit leer bleibt. Es steht aber auch nicht Null drin. Es ist leer. Wenn ich Daten aus dem alten bestand betrachten will muss das Feld abgefragt werden, nicht aber die neuen Felder. Wenn ich den neuen Datenbestand Abfrage ist das Feld Ladung ja leer und nur dann sollen die neuen Felder abgefragt werden. Und das alles muss in einer select passieren.

Noch ne Idee jemand?
Member: LianenSchwinger
LianenSchwinger Mar 20, 2013 at 19:50:19 (UTC)
Goto Top
... wenn in einem Feld nichts drin steht dann steht da NULL drin. NULL ist nicht gleich Null oder 0!

Und bei der kruden Beschreibung soll einer schlau werden. Stehn die alten und neuen Daten in ein und der selben Tabelle?
Wenn ja dann mach einen JOIN mit sich selbst und prüft das Feld Ladung der gejointen Tabelle auf "IS NULL".

G Jörg
Member: exchange
exchange Mar 20, 2013 at 21:44:31 (UTC)
Goto Top
Hallo,
nur mal zu Info, NULL und "" sind zwei paar Schuhe. Man kann sehr wohl in ein varchar Feld nichts reinschreiben. Das gehört sich aber nicht ;)

Es gibt Funktionen und Proceduren in MySQL. Damit solltest Du dich beschäftigen.

Gruß
Heiko
Member: nxclass
nxclass Mar 21, 2013 updated at 07:54:47 (UTC)
Goto Top
SELECT
  IF(`xzy` IS NULL OR `xzy` = '', CONCAT( `abz`, `dfg` ), NULL ) AS 'myresult'  
...

/* entweder: */
WHERE
  (`xzy` IS NULL OR `xzy` = '')  
/* oder: */
...
HAVING
  `myresult` IS NOT NULL
bin mir nicht sicher ob ich verstanden habe was Du möchtest - aber das Prinzip sollte klar sein.
Weiterhin würde ich dir empfehlen mit einem UPDATE die Daten auf einen einheitlichen Stand zu bringen.
Member: datadexx
datadexx Mar 21, 2013 at 08:04:45 (UTC)
Goto Top
Moin Jungs!

Die Daten stehen in der selben Tabelle. Ich versuche es mal so genau wie möglich zu beschreiben.

Die DB Tabelle nennt sich aauftrag wo durch ein Formular Daten zu einem Transportauftrag eingertragen werden.

In dem Formular gab es vorher das Eingabefeld "Ladung" wo z.B. sowas wie "17 H1 Pal. Saatgut 12000kg" eingetragen wurde. Dieser String landete in der DB im Feld "ladung" welches ein varchar ist.

Im Formular wurde das Feld "Ladung" mit neuen Eingabefeldern ersetzt und zwar durch "Anzahl", "Lademeter", "Lademittelart", "Warenart" und "Gewicht". Entsprechend wurden in der DB Tabelle aaauftrag 5 neue Felder eingefügt die gleichnamig heißen. Der Insert Befehl des Formulars befüllt nun nur noch die neuen Felder, nicht mehr das Feld "Ladung". Ein weiters Script generiert mit einer Select Abfrage aus den Daten der Tabelle aauftrag einen druckbaren Transportauftrag. Um auch noch die Transportaufträge der alten Version ansehen und ausdrucken zu können wird in der Selectabfrage das Feld "Ladung" benötigt + die neuen Felder. Die Daten der neuen Felder werden mit CONCAT zusammengeführt und es wird mit CASE abgefragt ob diese leer sind. Wenn leer wird nichts ausgegeben ansonsten der Inhalt des Feldes. Das muss so sein, da entweder im Formular Anzahl oder Lademeter angegeben wird und es soll nicht beides auf dem Transportauftrag stehen, denn mit dem Concat werden an Anzahl ein"x" angehangen und an Lademeter ein "ldm." und an Gewicht ein "kg".

Bisher sieht das so aus:

SELECT
posten.datum,
posten.transanr,
CONCAT ( posten.bezeichnung,'<br>', aauftrag.ladung,
CASE WHEN aauftrag.anzahl ='' THEN '' ELSE CONCAT(anzahl,'x&nbsp;'),
CASE WHEN aauftrag.ldm='' THEN '' ELSE CONCAT(ldm,'ldm&nbsp;'),
usw.

Funktionieren tut die Abfrage für Transportaufträge mit den neuen Daten, nicht aber für die wo die Daten noch im Feld "Ladung" stehen, dort bleibt die CONCAT abfrage leer, gibt also in der Druckversion nichts aus. Entferne ich die Abfrage für die neuen Felder wird mir der Inhalt des Feldes "Ladung" auch wieder angezeigt. Daher stammt die Idee die neuen felder nur abfragen zu lassen, wenn aauftrag.ladung leer ist und ansonsten nicht. Problem ist halt auch, dass das in die CONCAT rein muss da es sonst das Drucklayout zerschiesst. Also im CONCAT muss geprüft werden ob aauftrag.ladung leer ist, wenn ja die anderen Felder abfragen und wenn nicht leer nur aauftrag.ladung abfragen und den rest nach dem CONCAT.

Hoffe ich konnte es so genau wie möglich beschreiben, damit ihr was damit anfangen könnt.

Greetz
Member: LianenSchwinger
LianenSchwinger Mar 21, 2013 updated at 08:20:48 (UTC)
Goto Top
Hallo und guten Morgen,

mit dieser Beschreibung kann man zumindest etwas anfangen. face-smile

SELECT posten.datum,
       posten.transanr,
       CONCAT (posten.bezeichnung,'<br>',   
               CASE WHEN aauftrag.ladung IS NOT NULL 
                    THEN aauftrag.ladung,
                    ELSE CASE WHEN aauftrag.anzahl IS NULL THEN '' ELSE CONCAT(anzahl,'x&nbsp;') END,  
                         CASE WHEN aauftrag.ldm IS NULL THEN '' ELSE CONCAT(ldm,'ldm&nbsp;') END,  
                               .
                               .
                               .
               END) Text

usw.

G Jörg
Member: nxclass
nxclass Mar 21, 2013 at 08:24:35 (UTC)
Goto Top
mh ...
- CONCAT ( posten.bezeichnung,'<br>', aauftrag.ladung,  
+ CONCAT ( posten.bezeichnung,'<br>',  
+ CASE WHEN aauftrag.ladung = '' THEN CONCAT( /* deine neuen DB Felder */ ) ELSE aauftrag.ladung,  
müsste doch dann auch gehen ?
Member: Bierkistenschlepper
Bierkistenschlepper Mar 29, 2013 at 09:57:34 (UTC)
Goto Top
HTML mit MySQL auszugeben ist extrem unprofessionell. Finger weg.