Zum Inhalt wechseln


Foto

Einfache SQL Abfrage


  • Bitte melde dich an um zu Antworten
11 Antworten in diesem Thema

#1 starkeeper2009

starkeeper2009

    Newbie

  • 12 Beiträge

 

Geschrieben 18. März 2009 - 15:12

Hallo,
ich weiß, daß die Lösung ganz einfach sein müsste - habe jedoch leider noch keine Lösung gefunden.

Ich möchte bestimmte Felder einer SQL Datenbank exportieren

WHERE Artikel.Aktiv=-1 funktioniert Prima (festgelegter Wert).

Jetzt möchte ich jedoch, daß hiervon nur die Artikel ausgegeben werden, welche auch eine EAN-Nummer haben, also in folgender Form:

WHERE Artikel.Aktiv=-1 AND Artikel.Name!='0'

Leider handelt es sich bei dem Feld Name ja nicht um ein numerisches Feld sondern um ein var-Feld.

Wie sage ich dem export nun "exportiere mir nur die artikel, wo Artikel.Name nicht leer ist" ? habe es auch schon !='' versucht - was allerdings auch nicht funktionierte.

Ich bin über jede Art von Hilfe sehr dankbar!

Viele Grüße

Star

#2 jaksa

jaksa

    Member

  • 225 Beiträge

 

Geschrieben 18. März 2009 - 15:25

Wenn der Wert wirklich NULL ist kannst Du das bei (MS SQL 2008) mit IS NULL abfragen
WHERE Artikel.Name IS NOT NULL;

#3 starkeeper2009

starkeeper2009

    Newbie

  • 12 Beiträge

 

Geschrieben 18. März 2009 - 15:42

Leider ist der Wert nicht Null - Also es handelt sich um ganz leere Felder
Bei IS NOT NULL exportiert er nach wie vor alle Zeilen - Auch die in denen die Variabel leer ist.

Gruß
Star

#4 Dukel

Dukel

    Board Veteran

  • 9.311 Beiträge

 

Geschrieben 18. März 2009 - 15:47

Leider ist der Wert nicht Null - Also es handelt sich um ganz leere Felder
Bei IS NOT NULL exportiert er nach wie vor alle Zeilen - Auch die in denen die Variabel leer ist.

Gruß
Star


Nullwert ? Wikipedia

#5 NilsK

NilsK

    Expert Member

  • 12.466 Beiträge

 

Geschrieben 18. März 2009 - 15:53

Moin,

Leider ist der Wert nicht Null - Also es handelt sich um ganz leere Felder


NULL ist nicht "null" (0), sondern steht in SQL für ein leeres Feld (kein Wert).

Bei IS NOT NULL exportiert er nach wie vor alle Zeilen - Auch die in denen die Variabel leer ist.


Dann wird es schwierig, denn in dem Fall scheinen "leere" Felder nicht leer zu sein. Manche Applikationen machen so was leider.

Ändere die Abfrage doch bitte mal auf "... WHERE Feld IS NULL". Was wird nun zurückgegeben? Wenn keine Zeile zurückkommt, gibt es keine NULL-Werte, und dann müsste man analysieren, was denn wirklich ein "leeres" Feld kennzeichnet.

Gruß, Nils

Nils Kaczenski

MVP Cloud and Datacenter Management
... der beste Schritt zur Problemlösung: Anforderungen definieren!

Kostenlosen Support gibt es nur im Forum, nicht privat!


#6 starkeeper2009

starkeeper2009

    Newbie

  • 12 Beiträge

 

Geschrieben 18. März 2009 - 16:09

Vielen Dank - ALso es hat mir schon geholfen auch wenn es jetzt doch nach einem größeren Problem aussieht. es sind 200 posten die mit IS NULL exportiert werden - jetzt habe ich bestimmt noch 1000 weitere die zwar leer erscheinen aber nicht leer sind :/

#7 d.stegemann

d.stegemann

    Member

  • 275 Beiträge

 

Geschrieben 18. März 2009 - 16:36

Wenn der Name leer ist, aber nicht Null, könnte evtl. ein trim helfen...

Das wäre dann sowas in der Richtung...

select
....
from Artikel where artikel.aktiv = -1 and Artikel.Name is Null
union all
select
.....
from Artikel where artikel.aktiv = -1 and ltrim(rtrim(Artikel.Name)) = ''

Gruß

Dirk
Status: MCT

MC* is in da house ;)

#8 NilsK

NilsK

    Expert Member

  • 12.466 Beiträge

 

Geschrieben 19. März 2009 - 07:52

Moin,

Das wäre dann sowas in der Richtung...


gute Idee. Als Vereinfachung könnte man statt des UNION aber auch einfach ein OR im WHERE-Statement nutzen:

select
....
from Artikel where artikel.aktiv = -1 and (Artikel.Name is Null 
or ltrim(rtrim(Artikel.Name)) = '')

Gruß, Nils

Nils Kaczenski

MVP Cloud and Datacenter Management
... der beste Schritt zur Problemlösung: Anforderungen definieren!

Kostenlosen Support gibt es nur im Forum, nicht privat!


#9 d.stegemann

d.stegemann

    Member

  • 275 Beiträge

 

Geschrieben 19. März 2009 - 09:13

Tach,

kann man auch so machen...
Hängt aber m.E. auch von der Größe der Tabelle ab.

Bei größeren sollte das Union All schneller sein, da anderer Ausführungsplan. Aber das ist eine Frage die SQL Gott Elmar in der Newsgroup mit Sicherheit besser beantworten kann ;)

Gruß

Dirk
Status: MCT

MC* is in da house ;)

#10 starkeeper2009

starkeeper2009

    Newbie

  • 12 Beiträge

 

Geschrieben 19. März 2009 - 11:00

Hallo,

vielen Dank Euch :-)
Habe es gerade getestet und mit dem rtrim das klappt super!

WHERE ltrim(rtrim(KHKArtikel.EAN)) != '' AND KHKArtikel.Aktiv=-1

Viele Grüsse

Marco

#11 NilsK

NilsK

    Expert Member

  • 12.466 Beiträge

 

Geschrieben 19. März 2009 - 11:09

Moin,

Habe es gerade getestet und mit dem rtrim das klappt super!


schön!

!=


Geht es eigentlich um einen Microsoft SQL Server? Dann solltest du lieber die Syntax "WHERE NOT ..." verwenden als das "!=". Erstens liest es sich besser, zweitens ist es die übliche Variante.

Gruß, Nils

Nils Kaczenski

MVP Cloud and Datacenter Management
... der beste Schritt zur Problemlösung: Anforderungen definieren!

Kostenlosen Support gibt es nur im Forum, nicht privat!


#12 hh2000

hh2000

    Board Veteran

  • 550 Beiträge

 

Geschrieben 20. März 2009 - 12:09

Moin,

Zitat von d.stegemann
Bei größeren sollte das Union All schneller sein, da anderer Ausführungsplan. ....


ist ein bischen offtopic, da die Lösung für den Threadersteller ja schon vorhanden ist
(ich würde es auch mit "WHERE" statt "UNION" lösen, vorallem wenn das Resultat aktualisierbar bleiben muss).

Aber ich fand es trotzdem interessant, deswegen hier ein
Beispiel für unterschiedliche Ausführungspläne:
(Beispieldatenbank SQL-Server Northwind):

SELECT ProductName FROM Products
WHERE (CategoryID = 1 AND Discontinued = 0) OR (CategoryID = 2 AND Discontinued = 1)
GO
SELECT ProductName FROM Products
WHERE CategoryID = 1 AND Discontinued = 0
UNION ALL
SELECT ProductName FROM Products
WHERE CategoryID = 2 AND Discontinued = 1

Hier sieht der Plan der UNION Abfrage (optisch) besser aus, wobei ich kein Experte für Ausführungspläne bin.
Änderd man jedoch die WHERE-Klausel ab, z.B. so:

SELECT ProductName FROM Products
WHERE (CategoryID = 1 OR CategoryID = 2)
GO
SELECT ProductName FROM Products
WHERE CategoryID = 1 
UNION ALL
SELECT ProductName FROM Products
WHERE CategoryID = 2 

Dann sieht Plan 1 wieder besser aus. Ich denke es hängt von
Menge, abzufragende Spalten, Indizes, uvm. ab.
Ausführungsgeschwindigkeiten habe ich nicht gemessen, da in dieser Größe nicht signifikante Unterschiede vordanden sein sollten (in der Tabelle Product sind nur 77 Zeilen vorhanden).

Gruß Kai