Sqlite: Suchfunktion scheitert
Mario
- datenbank
Hi,
select * from test_5 where name||str||plz||ort||tel||eml||info LIKE '%test%';
funktioniert. Aber nur wenn alle Felder auch einen Inhalt haben, sonst kommt kein Ergebnis obwohl der Suchbegriff in einem der Felder auftritt. Was ist falsch?
Mario
Hallo,
select * from test_5 where name||str||plz||ort||tel||eml||info LIKE '%test%';
funktioniert. Aber nur wenn alle Felder auch einen Inhalt haben, sonst kommt kein Ergebnis obwohl der Suchbegriff in einem der Felder auftritt. Was ist falsch?
Deine Vorstellung, welche Auswirkung NULL-Werte haben.
Freundliche Grüße
Vinzenz
Hi,
»» select * from test_5 where name||str||plz||ort||tel||eml||info LIKE '%test%';
»» funktioniert. Aber nur wenn alle Felder auch einen Inhalt haben, sonst kommt kein Ergebnis obwohl der Suchbegriff in einem der Felder auftritt. Was ist falsch?Deine Vorstellung, welche Auswirkung NULL-Werte haben.
Nicht jeder kann perfekt englisch. Wie wärs mit eine deutschen Interpretation?
Mario
Hello,
Nicht jeder kann perfekt englisch. Wie wärs mit eine deutschen Interpretation?
(fast) jede Standardoperation mit NULL ergibt NULL - dementsprechend auch Concat, Addieren, Subtrahieren, ... - ein Vergleich mit NULL ergibt ebenfalls NULL. Eine WHERE-Klasusel für einen Datensatz mit NULL gilt als "nicht zutreffend".
MfG
Rouven
Hi,
»» Nicht jeder kann perfekt englisch. Wie wärs mit eine deutschen Interpretation?
(fast) jede Standardoperation mit NULL ergibt NULL - dementsprechend auch Concat, Addieren, Subtrahieren, ... - ein Vergleich mit NULL ergibt ebenfalls NULL. Eine WHERE-Klasusel für einen Datensatz mit NULL gilt als "nicht zutreffend".
Also ist meine Abfrage wohl sowas wie concat, es wird als einzelnes Feld gesehen? Hmm, die Möglicheit dieser Abfrage habe ich irgendwann mal hier im Forum gefunden, aber wenn es so wohl nicht geht wie dann, ohne jedes einzelne Feld mit where feld2 like'%%' or feld2 like'%%'...?
Mario
Stop:
Maine Aussage:
Also ist meine Abfrage wohl sowas wie concat, es wird als einzelnes Feld gesehen?
kann ja auch wieder nicht stimmen, denn wenn es als ein Feld gesehen würde wär ja trotzdem der Suchbegriff drin, also verstehe ich es immer noch nicht.
Mario
Hi,
Maine Aussage:
Also ist meine Abfrage wohl sowas wie concat, es wird als einzelnes Feld gesehen?
kann ja auch wieder nicht stimmen, denn wenn es als ein Feld gesehen würde wär ja trotzdem der Suchbegriff drin, also verstehe ich es immer noch nicht.
Rouven sagte es doch bereits:
(fast) jede Standardoperation mit NULL ergibt NULL - dementsprechend auch Concat, Addieren, Subtrahieren, ...
Also nein, dann wäre dein Suchbegriff nicht mehr "drin", wenn eine der Spalten NULL enthält.
MfG ChrisB
Hi,
Rouven sagte es doch bereits:
»» > (fast) jede Standardoperation mit NULL ergibt NULL - dementsprechend auch Concat, Addieren, Subtrahieren, ...Also nein, dann wäre dein Suchbegriff nicht mehr "drin", wenn eine der Spalten NULL enthält.
will wohl irgendwie nicht in meinem Kopf, weil ich || eben als "oder" ansehe. Aber gut wenn es so ist, ist es eben so.
Nur, wie kann ich dann ein vernünftige Suche auf alle Felder anwenden, auch wenn einige leer sind?
Erstaunlich dass Google mich da nicht weiterbringt.
Mario
Hallo,
will wohl irgendwie nicht in meinem Kopf, weil ich || eben als "oder" ansehe. Aber gut wenn es so ist, ist es eben so.
ist im Ausnahmefall des SQL-Dialektes von MySQL so. Andere Dialekte vie der von SQLite unterstützte Dialekt sehen das anders (Oracle übrigens auch).
Nur, wie kann ich dann ein vernünftige Suche auf alle Felder anwenden, auch wenn einige leer sind?
Erstaunlich dass Google mich da nicht weiterbringt.
Eine Archivsuche lieferte Dir viele, viele Treffer zu COALESCE(), die auch SQLite kennt.
Freundliche Grüße
Vinzenz
Hi,
Eine Archivsuche lieferte Dir viele, viele Treffer zu COALESCE(), die auch SQLite kennt.
Irgendwie kommt mir das hier vor wie wenn einer fragt: Wie wechsele ich einen Autoreifen? Und zur Antwort bekommt: Lerne erst mal 3 Jahre Automechaniker, dann gehts....
Mario
Hello,
Irgendwie kommt mir das hier vor wie wenn einer fragt: Wie wechsele ich einen Autoreifen? Und zur Antwort bekommt: Lerne erst mal 3 Jahre Automechaniker, dann gehts....
Ne, eigentlich nicht. Was dir eigentlich gerade passiert ist:
"ich hab versucht, die Radmuttern mit einem 15mm-Schlüssel zu lösen - hat nicht geklappt"
Als Antwort hast du bekommen:
"Sie mal da drüben auf dem Tisch, da müsste noch ein 17mm-Schlüssel liegen, der sollte besser passen"
MfG
Rouven
Hi,
Als Antwort hast du bekommen:
"Sie mal da drüben auf dem Tisch, da müsste noch ein 17mm-Schlüssel liegen, der sollte besser passen"
Nur zu dumm dass der dann auch nicht passt. Aber davon abgesehen, sind die bisherigen Antworten zu dieser bestimmt einfachen Frage(wenn man es einmal weiss) ein Paradebeispiel, wie Antworten nicht ausfallen sollten. Aber darüber gab es ja hier schon oft genug Diskussionen, ja ich stehe auch auf dem Standpunkt den SelfFaktor zu nutzen, aber man kann es auch übertreiben.
Ein Antwort ala "Null Felder ergeben bei solchen Abfragen immer Null aus dem und dem Grund und eine sinnvolle Abfrage ist daher nur möglich wenn man das macht wie im Beispiel siehe: URL" hätte mir(und auch bestimmt später anderen) wesentlich mehr gebracht stundenlang irgendwelche Seiten zu durchforsten ohne überhaupt mal in die Nähe einer Lösung zu gelangen.
Mario
Hello,
Ein Antwort ala "Null Felder ergeben bei solchen Abfragen immer Null aus dem und dem Grund
gab ich dir, indem ich dir (im Anschluss an Vinzenz) dir sagte, dass Operationen mit NULL NULL ergeben.
und eine sinnvolle Abfrage ist daher nur möglich wenn man das macht wie im Beispiel siehe: URL" [...] Nähe einer Lösung zu gelangen.
hat Vinzen getan, indem er dich auf COALESCE hingewiesen hat, mit dem du den ersten NICHT-NULL-Wert suchen kannst. Wenn du weitere Anforderungen hast, wirst du etwas überlegen müssen. Und ich poche immer wieder darauf: deskchecking: wie gehst du vor, wenn du es auf einem Blatt Papier machst?
Du SELECTierst einen Satz
FROM stapel
WHERE (spalte_x enthält einen Wert UND spalte_x enthält meinen gesuchten Wert)
OR (spalte_y enthält einen Wert UND spalte_y enthält meinen gesuchten Wert)
MfG
Rouven
Hi,
»» Ein Antwort ala "Null Felder ergeben bei solchen Abfragen immer Null aus dem und dem Grund
gab ich dir, indem ich dir (im Anschluss an Vinzenz) dir sagte, dass Operationen mit NULL NULL ergeben.
»»
ja hast "du" getan, nicht aber Vincenz. Und damit kam ich zur nächsten vorhersehbaren Frage.
hat Vinzen getan, indem er dich auf COALESCE hingewiesen hat, mit dem du den ersten NICHT-NULL-Wert suchen kannst.
Die Erklärungen die ich zu COALESCE finden konnte bedürfen anscheinend selbst eines ausgedehenten Studiums, denn da ich kein funktionierendes Beispiel finden konnte habe ich "probiert wie verstanden" aber da kommen dann auch wieder nur Syntaxfehler.
Wenn du weitere Anforderungen hast, wirst du etwas überlegen müssen. Und ich poche immer wieder darauf: deskchecking: wie gehst du vor, wenn du es auf einem Blatt Papier machst?
Du SELECTierst einen Satz
FROM stapel
WHERE (spalte_x enthält einen Wert UND spalte_x enthält meinen gesuchten Wert)
OR (spalte_y enthält einen Wert UND spalte_y enthält meinen gesuchten Wert)
Das verstehe ich jetzt so, dass es anscheinend keine Lösung gibt und ich doch alles in OR Anweisungen abfragen muss. Na dann hätte mir diese Antwort viel Zeit und Mühe erspart. Dann kann ich mich ja jetzt wieder meinem Projekt widmen was bis morgen fertig sein muss und hoffen nicht nochmal 4 Stunden wegen einer sinnlosen Frage zu verschenken.
Danke
Mario
Hello,
Die Erklärungen die ich zu COALESCE finden konnte bedürfen anscheinend selbst eines ausgedehenten Studiums, denn da ich kein funktionierendes Beispiel finden konnte habe ich "probiert wie verstanden" aber da kommen dann auch wieder nur Syntaxfehler.
huch? Nimms mir nich krumm, aber ist
--
coalesce(X,Y,...) Return a copy of the first non-NULL argument.
--
so schwer zu verstehen? Die Funktion nimmt eine beliebige (fast) Menge von Parametern auf und liefert den ersten zurück, der NICHT NULL ist.
COALESCE(meine_spalte, '') liefert also meine_spalte, sofern meine_spalte einen Wert hat, '' sonst.
Das verstehe ich jetzt so, dass es anscheinend keine Lösung gibt und ich doch alles in OR Anweisungen abfragen muss.
ja und nein. Eine Kombination aus beiden Lösungswegen ist ebenfalls möglich. Dein Grundproblem ist einfach, dass dein CONCAT niemals das NULL zu sehen bekommen darf. Du kannst also auch einfach, siehe COALESCE, den NULL-Wert vorher eliminieren und dann konkatenieren:
WHERE wert_garantiert_nicht_NULL||anderer_wert_garantiert_nicht_NULL LIKE '...'
MfG
Rouven
Hi,
ich weiss wie schwierig es ist jemanden etwas beizubringen der nicht den gleichen Wissensstand hat. Aus dem Grund sind die meissten Fachbücher schlecht. Man hat einfach nicht mehr die Sichtweise eines Nichtwissenden.
Wenn ich nun:
select * from test_5 where coalesce(name,str,plz,ort,tel,eml,info) LIKE '%test%';
probiere kommt nichts.
Also muss es ja irgendwie anders funktionieren, mir nicht klar.
STOP: Es funktioniert doch, kleiner Copy&Paste Fehler hatte sich eingeschlichen. Danke.
Mario
Hello,
select * from test_5 where coalesce(name,str,plz,ort,tel,eml,info) LIKE '%test%';
probiere kommt nichts.
ja. Stimmt. Lies nochmal aufmerksam meinen Beitrag. Das hier ist die einzige Variante, die dich nur in Ausnahmefällen ans Ziel bringt. COALESCE ist EINE Funktion die DEN ersten Wert liefert, der nicht NULL ist. EINEN Wert. Das ist aber nicht dein Ziel.
Wie gesagt, kehre zurück zu meinem letzten Post:
(1) nutze COALESCE um NULL-Spalten zu eliminieren
(2) nutze CONCAT um alle Spalten auf einmal zu durchsuchen
MfG
Rouven
Hi,
Wie gesagt, kehre zurück zu meinem letzten Post:
(1) nutze COALESCE um NULL-Spalten zu eliminieren
(2) nutze CONCAT um alle Spalten auf einmal zu durchsuchen
oh nein, jetzt dachte ich endlich eine Lösung zu haben, jetzt das...
Wie denn? Ich habe es jetzt so probiert:
select * from test_5 where coalesce(name)||coalesce(str)||coalesce(plz)||coalesce(ort)||(coalesce(tel)||coalesce(eml)||coalesce(info) LIKE '%test%';
geht nicht!
Mario
Hello,
select * from test_5 where coalesce(name)||coalesce(str)||coalesce(plz)||coalesce(ort)||(coalesce(tel)||coalesce(eml)||coalesce(info) LIKE '%test%';
geht nicht!
stimmt. Erstens ist die Syntax falsch (beachte den Hinweis "mindestens zwei Parameter"), zweitens macht es auch einfach keinen Sinn: liefert den ersten Wert der Paramter, der nicht NULL ist. Du stellst keine Alternative bereit. Du sagst:
Gib mir aus der Liste
MfG
Rouven
Hi,
ok jetzt ist klar habe den zweiten Parameter nur als Platzhalter für weitere Feldnamen geshehen ala "...".
Danke. Aber trotzdem auch wenn Vinzenz nun den Query fast vormacht, warum erst Stunden nach meiner Frage? Ihr wisst dich selbst was Zeitdruck ist. Und das man aus einen fertigen Query genauso viel lernen kann wie tausend Verweise auf irgendwelche Seiten ist auch klar. Ich kann verstehen wenn jemand sagt "wie funktioniert ein formailer, hat einer ein Script?" das man das dann anders handhabt, aber ich habe nur nach einem query gefragt.
Wie auch immer nun scheint es zu laufen, fertig werde ich wohl heute Nacht nicht mehr und zu coalesce weiss ich jetzt auch nicht besonders viel, aber so was schlage ich dann nochmal nach wenn ich Zeit habe.
Danke
Mario
Hello,
Ihr wisst dich selbst was Zeitdruck ist.
ja - wissen "wir". Ich mache das hauptberuflich. Ich weiß wie es ist, wenn Projektleiter hinter einem stehen und mit den Fingern trommeln. Get used to it. Das Problem ist, dass ein Entwickler, der sich Lösungen nicht erarbeiten kann zunehmend ins Hintertreffen gerät...
Und das man aus einen fertigen Query genauso viel lernen kann wie tausend Verweise auf irgendwelche Seiten ist auch klar. Ich kann verstehen wenn jemand sagt "wie funktioniert ein formailer, hat einer ein Script?" das man das dann anders handhabt, aber ich habe nur nach einem query gefragt.
Nacht nicht mehr und zu coalesce weiss ich jetzt auch nicht besonders viel
...eben weil du dir an dieser Stelle vollkommen widersprichst. Wir haben dir nicht mal ansatzweise bzw. erst sehr spät die fertige Lösung gegeben und trotzdem du hast sie nicht "verstanden" im Sinne von durchdacht. Wenn wir dir das fertige Query gegeben hättest, hättest du es 1:1 kopiert...So bestand die Hoffnung, dass du verstehst was warum wie funktioniert. Und auch wenn dein Druckmacher das heute Abend und morgen früh nicht zugeben will, eigentlich sind Leute die sich Themen erarbeiten und Erfahrungen sammeln deutlich wertvoller...
MfG
Rouven
Hi,
Und auch wenn dein Druckmacher das heute Abend und morgen früh nicht zugeben will, eigentlich sind Leute die sich Themen erarbeiten und Erfahrungen sammeln deutlich wertvoller...
nur solange sie dieses Wissen nicht wieder vergessen.
Ich hatte gerade zu Anfangszeiten(und oft leider immer noch) den Drang zum Perfektionismus. Das bedeutet unweigerlich lesen, probieren, lesen, ...
Und was kommt am Ende(zumindest bei mir ist das so) dabei raus?
1. Unendlich viel Zeit geht dabei drauf
2. Ich werde für eine gewisse Zeit fachlich top, aber
3. ich vergesse das auch genau so schnell wie ich es gelernt habe
Fazit: Trotz enormer Dokumentationen bin ich nicht in der Lage mir komplexe alte Scripte von mir wieder leicht in Erinnerung zu rufen.
Beispiel: Ich benötige gleich wieder eine Uploadfunktion, das hatte ich doch schon mal... Ja die könnte ich dann auch wieder nutzen, aber diese Class die ich da erstellt habe ist so umfangreich und mit Sondermöglichkeiten (zb. Thumbnailgenerierung, Wasserzeichen, Archivierungen), dass ich gar nicht mehr beim Code lesen verstehe was ich da eigentlich alles genutzt habe.
So wenn ich dann nun hier die Frage stelle, wieso ist move_upload_file besser als copy? würde ich wieder als kompletter Anfänger dastehen obwohl ich gerade bei dem Produkt schon hochwertige Arbeit abgeliefert habe. Und schon behandelt man mich dann auch so und verweist aufs Manual oder hinterfragt anstatt einfach nur zu antworten, was aber genau das wäre was ich bräuchte.
2002 habe ich für eine Kontoverwaltung für eine Firma geschrieben, darin mehr als 20 Mysql tabellen die grösstenteils über komplizierte joinAbfragen
funktionieren. Das Wissen das ich mir damals angeignet hatte um das Projekt zu erstellen ist weg.
So habe ich nun die bekannte Erkenntnis eingesehen:
"Man muss nicht wissen, nur wissen wo man nachschlägt."
Und das klappt auch in der Regel ganz gut, nur zu meiner Frage heute konnte ich nichts finden.
Mario
Hello,
So habe ich nun die bekannte Erkenntnis eingesehen:
"Man muss nicht wissen, nur wissen wo man nachschlägt."
das betrachte ich ganz und gar nicht als Widerspruch zu meiner vorherigen Aussage. Es geht mir überhaupt nicht um auswendiges Wissen. Die Welt ist IMHO zu komplex um sich darin auf vielen Gebieten sicher bewegen zu können. Aber die Fähigkeit sich ein Themengebiet zu erschließen, die ist wertvoll. Und unter erschließen verstehe ich eben NICHT blind eine Lösung zu übernehmen. Das halte ich für einen denkbar schlechten Weg. Intelligente Adaption möchte ich es mal nennen, das ist das Zauberwort.
MfG
Rouven
Hi,
Intelligente Adaption möchte ich es mal nennen, das ist das Zauberwort.
ja und insofern mal ein Beispiel wie ich mir eine perfekte Anwort vorgestellt hätte. Wäre die Antwort auf meine Frage gewesen:
Felder ohne Werte stelle Null Werte dar und lassen sich somit nicht bei deiner Abfrage bearbeiten, weil bei der Operation wieder NULL rauskommt(also in etwa wie deine Antwort). Um dennoch deine Concatmöglichkeit zu nutzen müsstest du mit coalesce vorgehen in etwa: where coalesce(feld1)||coalesce(feld2) like ...
Dann hätte ich das probiert und es hätte funktioniert. Da mir die Zeit fehlte hätte ich auch nicht nach Warum-Gründen gesucht oder gefragt, aber alleine aus Interesse hätte ich das nachgeholt und wenn nicht verstanden nochmals konkret nachgefragt.
Aber mir wäre geholfen, mein Projekt fertig, und ich gutgelaunt.
Nun habe ich zwar die Lösung aber um welchen Preis?
Mario
Bin wohl schon zu müde, mache es schon wieder falsch:
in etwa: where coalesce(feld1)||coalesce(feld2) like ...
Natürlich so ;-) :
in etwa: where coalesce(feld1,'')||coalesce(feld2,'') like ...
Mario
yo,
So bestand die Hoffnung, dass du verstehst was warum wie funktioniert.
endloses thema bei selfhtml. ich denke, wenn jemand ein rohes ei haben will, gib ihm ein rohes ei, dann kann er damit seine spiegeleier selber bruzeln. wenn jemand schon ein fertiges spiegelei haben will, dann gib ihm das oder man läßt es einfach. man sollte ihm nicht das rohe ei aufdrängen wollen. als vorschlag sicherlich, aber jeder muss selbst entscheiden können, was in der jeweiligen situation gut oder nicht gut ist.
ich habe auch nicht immer die zeit, alles selbst zu kochen, auch wenn das wesentlich gesünder wäre nud auch den geldbeutel freut.
Ilja
Hallo,
ich weiss wie schwierig es ist jemanden etwas beizubringen der nicht den gleichen Wissensstand hat. Aus dem Grund sind die meissten Fachbücher schlecht. Man hat einfach nicht mehr die Sichtweise eines Nichtwissenden.
ich hab' vor allem keine Glaskugel.
Ich kannte Deinen Wissensstand nicht. Ich ging davon aus, dass Du weißt, dass Du links eine Zeichenkette zusammenbaust und über LIKE nachschaust, ob Dein Suchwort enthalten ist. Woher sollte *ich* wissen, dass Du *nicht* weißt, was in SQLite der ||-Operator bewirkt?
Wenn ich nun:
select * from test_5 where coalesce(name,str,plz,ort,tel,eml,info) LIKE '%test%';
dann ist dies falsch. Das liefert Dir vor dem Vergleich die erste nicht leere Spalte. Was ist wenn Dein Suchbegriff erst in der zweiten nichtleeren Spalte auftritt? Dann versagt Deine WHERE-Klausel.
Rouven sagte dagegen:
Baue eine garantiert nicht den Wert NULL enthaltene Zeichenkette zusammen, indem Du sie aus Einzelstücken zusammenbaust, die *aller* garantiert nicht NULL sind:
COALESCE(name, '') ist garantiert nicht NULL, sondern gegebenenfalls der Leerstring. Dieser verfälscht Dir nicht Dein Ergebnis.
COALESCE(str, '') ist garantiert nicht NULL, sondern gegebenenfalls der Leerstring. Dieser verfälscht Dir nicht Dein Ergebnis.
COALESCE(name, '') || COALESCE(str, '') ist garantiert nicht NULL und liefert Dir Deinen Treffer auch dann, wenn das Suchwort in der Spalte str vorkommt und auch die Spalte name nicht leer ist.
COALESCE(plz, '') ist garantiert nicht NULL, sondern gegebenenfalls der Leerstring. Dieser verfälscht Dir nicht Dein Ergebnis.
COALESCE(name, '') || COALESCE(str, '') || COALESCE(plz, '') ist garantiert nicht NULL und liefert Dir Deinen Treffer auch dann, wenn das Suchwort in der Spalte plz vorkommt und auch die Spalten name (und/oder) str nicht leer sind.
Die Fortsetzung müsstest Du selbst hinbekommen ...
Freundliche Grüße
Vinzenz
Hi,
Irgendwie kommt mir das hier vor wie wenn einer fragt: Wie wechsele ich einen Autoreifen? Und zur Antwort bekommt: Lerne erst mal 3 Jahre Automechaniker, dann gehts....
Na in deinem Falle sollte man vielleicht lieber antworten: Nimm dir ein Taxi, da brauchst du dich um nichts zu kümmern - und das ist bei deinem Kenntnisstand und deiner Bereitschaft, diesen durch eigene Recherche zu erweitern, wohl das beste.
MfG ChrisB
Hallo,
» Also ist meine Abfrage wohl sowas wie concat, es wird als einzelnes Feld gesehen?
kann ja auch wieder nicht stimmen, denn wenn es als ein Feld gesehen würde wär ja trotzdem der Suchbegriff drin,
Nein. Der Suchbegriff ist nicht enthalten.
also verstehe ich es immer noch nicht.
Welches Ergebnis erhältst Du bei der von mir angegebenen Abfrage?
Freundliche Grüße
Vinzenz
Hi,
Welches Ergebnis erhältst Du bei der von mir angegebenen Abfrage?
Nur Fehler:
....sqlite_query() [function.sqlite-query]: near "||": syntax error in....
Mario
Hallo,
» Welches Ergebnis erhältst Du bei der von mir angegebenen Abfrage?
Nur Fehler:
....sqlite_query() [function.sqlite-query]: near "||": syntax error in....
nutze einen vernünftigen Client und kein PHP :)
Das Ergebnis ist NULL.
Freundliche Grüße
Vinzenz
Hallo,
» »» Was ist falsch?
» Deine Vorstellung, welche Auswirkung NULL-Werte haben.
Nicht jeder kann perfekt englisch. Wie wärs mit eine deutschen Interpretation?
Wo hast Du bisher gesucht? Es gibt auch deutschsprachige Doku zu SQL (nicht notwendigerweise zu SQLite, aber zu DBMS, die NULL-Werte vergleichbar handhaben).
Tipp: Was liefert Dir SQLite bei der Abfrage
SELECT 'etwas' || NULL
zurück?
Freundliche Grüße
Vinzenz