Perl + Sql
Thorsten Steffen
- perl
Hi,
ich lese mit perl eine SQL-Datenbank aus, allerdings möchte ich nur Felder auswerten, die nicht leer sind; Felder, die leer sind, haben ja den laut SQL Wert NULL, oder ?
Also mache ich folgende Abfrage:
...
while (@satz = $sth->fetchrow_array)
...
if ($satz[8] != "NULL")
{
print "$satz[8]<BR>\n";
}
if ($satz[10] != "NULL")
{
print "$satz[10]<BR>\n";
}
if ($satz[11] != "NULL")
{
print "$satz[11]\n";
}
print "$satz[11]\n";
...
Das letzte if wird aber immer übersprungen (also scheinbar $satz[11]="NULL"), obwohl das Feld definitiv Daten enthält, wenn ich es nach der Abfrage ausgebe. Muß die Abfrage auf "leere" Felder anders erfolgen oder wo liegt der Fehler ?
Gruß
Thorsten
Heyho,
Hi,
ich lese mit perl eine SQL-Datenbank aus, allerdings möchte ich nur Felder auswerten, die nicht leer sind; Felder, die leer sind, haben ja den laut SQL Wert NULL, oder ?
if ($satz[11] != "NULL")
Du hast den Fehler gemacht, den wahrscheinlich jeder, der mit SQL zu tun hat, schon einmacl gemacht hat.
Die genaue Syntax in Perl kann ich Dir zwar nicht sagen, aber in ASP sieht es denn so aus.
If Not IsNull([tblTable].[Feldname]) Then
...
End if
Da Dein "NULL" eine Zeichenkette ist, kann es auf einem Feld mit NULL-Wert eigentlich gar nicht gehen. Selbst leere Felder, die z.B. dynamisch einen leeren String zugwiesen bekommen, haben keinen NULL-Wert, sondern eben "". Diesen kann man mit If Feld = "" Oder If Len(Feld) = 0 anfangen. Wie gesagt, alles in ASP.
Tschau, Stefan
Hallo Thorsten,
while (@satz = $sth->fetchrow_array)
...
if ($satz[8] != "NULL")
{
...Das letzte if wird aber immer übersprungen (also scheinbar $satz[11]="NULL"), obwohl das Feld definitiv Daten enthält, wenn ich es nach der Abfrage ausgebe. Muß die Abfrage auf "leere" Felder anders erfolgen oder wo liegt der Fehler ?
Textvergleiche solltest Du mit den entsprechenden vergleichoperatoren eq (equal) bzw. ne (not equal) durchführen. Ansonsten wird versucht, die Strings als Zahlen zu interpretieren - d.h. in diesem Fall, daß 'NULL' der Zahl 0 entspricht :). Wenn Du nun zufällig in den ersten Spalten eine Zahl unlgeich 0, in der elften jedoch einen String oder ein 0 hattest, sollte sich das Programm genauso verhalten, wie Du es beschrieben hast.
ABER, wenn man es sich genauer überlegt, kann es gar nicht sinnvoll sein, einen SQL-NULL Wert durch den String NULL zu repräsentieren - wie will man dann denn den String NULL ablegen? DBI macht das auch gar nicht. Ensprechende Werte sind schlichtweg nicht definiert - genauer gesagt 'undefined'. Die Abfrage sollte also wie folgt aussehen:
if (defined ($satz[8]))
{
print "$satz[8]<BR>\n";
}
...
Oder vielleicht so:
print "$satz[8]<BR>\n" if defined $satz[8];
Viel Erfolg,
Jörk
ich lese mit perl eine SQL-Datenbank aus, allerdings möchte ich nur Felder auswerten, die nicht leer sind; Felder, die leer sind, haben ja den laut SQL Wert NULL, oder ?
Muß die Abfrage auf "leere" Felder anders erfolgen oder wo liegt der Fehler ?
Wenn Du wirklich SQL zur Verfügung hast (und nicht einen abgemagerten Schmuddel-Dialekt), dann blende die NULL-Spalten doch gleich beim Lesen aus:
SELECT ... FROM ... WHERE ... AND name IS NOT NULL;
usw.
Die Datenbank weiß, wie sie eine Abfrage auf "NULL" machen soll.
Und falls Du ggf. sogar verhindern willst, daß es NULL-Werte überhaupt geben darf (damit später Deine Anwendungen diese ganze Abfragerei gar nicht machen müssen), dann definiere entsprechende Constraints für die Spalten der Tabelle (d. h. "NOT NULL" hinter den Datentyp der Spalte).
Datenintegrität läßt sich in der Datenbank viel eleganter lösen als durch Nachverarbeitung mit Perl etc.
ich lese mit perl eine SQL-Datenbank aus, allerdings möchte ich nur Felder auswerten, die nicht leer sind; Felder, die leer sind, haben ja den laut SQL Wert NULL, oder ?
Muß die Abfrage auf "leere" Felder anders erfolgen oder wo liegt der Fehler ?Wenn Du wirklich SQL zur Verfügung hast (und nicht einen abgemagerten Schmuddel-Dialekt), dann blende die NULL-Spalten doch gleich beim Lesen aus:
SELECT ... FROM ... WHERE ... AND name IS NOT NULL;
usw.
Die Datenbank weiß, wie sie eine Abfrage auf "NULL" machen soll.Und falls Du ggf. sogar verhindern willst, daß es NULL-Werte überhaupt geben darf (damit später Deine Anwendungen diese ganze Abfragerei gar nicht machen müssen), dann definiere entsprechende Constraints für die Spalten der Tabelle (d. h. "NOT NULL" hinter den Datentyp der Spalte).
Datenintegrität läßt sich in der Datenbank viel eleganter lösen als durch Nachverarbeitung mit Perl etc.
Hi,
ich rede übrigens von mysql, außerdem geht es mir dadrum, Felder von Datensätzen, die leer sind, nicht anzuzeigen, und nicht in diesem Fall den ganzen Satz zu verwerfen, was durch dein SQL-Statement bewirkt würde. Und da es manche Felder in meiner Datenbank optional sind, kann ich die leider auch nicht als not null definieren.
so long
Thorsten
geht es mir dadrum, Felder von Datensätzen, die leer sind, nicht anzuzeigen
Schau mal nach, ob Dein SQL eine Funktion namens "nvl" kennt. Diese kann man auf Argumente der Select-Liste anwenden und somit eine Ersatz-Zeichenkette für den NULL-Fall angeben. Diese könntest Du möglicherweise besser abfragen - vielleicht kannst Du dort auch schon oder Ähnliches einsetzen lassen ...