Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi LIKE (https://www.delphipraxis.net/49422-like.html)

Schodn 11. Jul 2005 08:34

Datenbank: SQL • Zugriff über: ADO

LIKE
 
Hallo Leute ich hab eine Montag morgen frage


SELECT * FROM firma WHERE firmen_plz LIKE '+ QuotedStr(str_1) + ' AND firmen_bez LIKE ' + QuotedStr(str_2) + ' order by firmen_bez'

Diese Abfrage führt er so aus als wär das AND ein OR. Er schränkt nicht auf beide Spalten ein sondern nur auf eine.

Kann mir hier wer weiterhelfen?

Touchdown 11. Jul 2005 08:50

Re: LIKE
 
Was steht den z.B. in str_1 und str_2? Das Statement sieht doch ok aus, bei 'like' könnte es logisch richtig sein was die Datenbank dir da wieder gibt.

Schodn 11. Jul 2005 08:53

Re: LIKE
 
str_1 := '9';
str_2 := 'sch';

Er gibt mir aber auch Einträge zurück, die nicht 9 in der PLZ enthalten.

mikhal 11. Jul 2005 08:58

Re: LIKE
 
Was erhältst du denn für ein Ergebnis, wenn du an deine Strings noch ein '%' hängst. Ansonsten macht die Verwendung von LIKE sowieso keinen Sinn, da es die langsamste Vergleichsoperation ist, die SQL zu bieten hat.

Grüße
Mikhal

Jasocul 11. Jul 2005 09:03

Re: LIKE
 
Bei mir gibt die Abfrage eine leere Menge zurück, da keine Joker-Zeichen enthalten sind (Oracle). Mit den entsprechenden Zeichen läuft es aber genau, wie gewünscht.

Schodn 11. Jul 2005 09:09

Re: LIKE
 
str_1 := '%' + str_1 + '%';
str_2 := '%' + str_2 + '%';


hab hab ich vorangestellt funktioniert aber nicht

das like geht schon aber ich will nur einträge erhalten, die auf beide spalten zutreffen.
ich bekomme aber auch einträge zurück, die nur auf eine Spalte zutreffen.

das AND ist so wie ein OR

Treffnix 11. Jul 2005 09:15

Re: LIKE
 
bist du sicher, dass du nicht nur dein Statement falsch verstehst? Bei %9% ist ja jede Postleitzahl gültig, die irgendwo eine 9 hat. Das können schon ne Menge sein.

Welche DB benutzt du eigentlich? M$-SQL?

Poste doch mal ne Ergebnismenge.

Jasocul 11. Jul 2005 09:18

Re: LIKE
 
Lass dir die Werte vor der Ausführung des SQL-Statements mal anzeigen.

mikhal 11. Jul 2005 09:19

Re: LIKE
 
Welche Datenbank verwendest du eigentlich, MS SQL Server MySQL?

Wie Jasocul bereits mitteilte, funktinioniert es bei Oracle wie erwartet und nach meinen Erfahrungen sollte auch MS SQL Server, Firebird und PostgreSQL wie erwartet arbeiten.

Grüße
Mikhal

Schodn 11. Jul 2005 09:23

Re: LIKE
 
SELECT * FROM FIRMA WHERE firmen_plz LIKE '+ QuotedStr(str_1) + ' OR firmen_bez LIKE ' + QuotedStr(str_2) + ' order by firmen_bez
SELECT * FROM FIRMA WHERE firmen_plz LIKE '+ QuotedStr(str_1) + ' AND firmen_bez LIKE ' + QuotedStr(str_2) + ' order by firmen_bez


Die beiden geben das gleiche zurück egal ob AND oder OR das ist mein Problem

Ja ich will alle PLZ zurückbekommen die eine 9 vorhanden haben egal wo und alle die einen bestimmten string im Namen aufweisen.
aber nur solche einträge, bei den beide einschränkungen zutreffen

Schodn 11. Jul 2005 09:23

Re: LIKE
 
Verwende SQL SERVER

mikhal 11. Jul 2005 09:26

Re: LIKE
 
Versuch es mal mit Klammerung der Filter

Delphi-Quellcode:
SELECT * FROM FIRMA WHERE (firmen_plz LIKE '+ QuotedStr(str_1) + ') OR (firmen_bez LIKE ' + QuotedStr(str_2) + ') order by firmen_bez
Grüße
Mikhal

Schodn 11. Jul 2005 09:29

Re: LIKE
 
hab ich auch schon versucht aber leider funktionierts auch nicht

NICHT OR sondern AND aber is ja egal, da die beiden bei mir das gleiche zurückgeben

Treffnix 11. Jul 2005 09:30

Re: LIKE
 
Also, ich habs gerade mal unter MS-SQL getestet und auch da funktioniert es wie erwartet. Von daher behaupte ich mal, dass das Statement in Ordnung ist, aber mit deinen Werten etwas nicht stimmt. Hast du mal überprüft, ob die Werte am Ende auch korrekt bespielt sind? Evtl. mal im Profiler, zumindest aber im Debugger anschauen!

Schodn 11. Jul 2005 09:36

Re: LIKE
 
Statement und werte sind in ordnung

ich hab nur das problem das die 2 das gleiche zurückliefern, ist das bei LIKE normal?

SELECT * FROM FIRMA WHERE firmen_plz LIKE '+ QuotedStr(str_1) + ' OR firmen_bez LIKE ' + QuotedStr(str_2) + ' order by firmen_bez
SELECT * FROM FIRMA WHERE firmen_plz LIKE '+ QuotedStr(str_1) + ' AND firmen_bez LIKE ' + QuotedStr(str_2) + ' order by firmen_bez

Jasocul 11. Jul 2005 09:42

Re: LIKE
 
Nein. Außer bei Sonderfällen, die wir aber hier nicht betrachten.

Phoenix 11. Jul 2005 09:44

Re: LIKE
 
Nein, ist es nicht.

Bei MS SQL solltest Du zwingend die Platzhalter verwenden.

Teste die Statements mal einzeln (also nur den Part mit 9 in der PLZ und dann nur den Part mit 'sch' im Namen z.B.). Wenn die funktionieren, dann muss eine And-Verknüpfung der beiden Teile auch funktionieren.

Ich denke das durch das fehlen der Platzhalter die Abfragen unscharf werden und daher ungewollte Ergebnisse liefern.

Schodn 11. Jul 2005 09:49

Re: LIKE
 
einzeln gehen sie. ich habs bereits getestet

was meinst du mit platzhalter Parameter?

ich bin am verzweifeln

Catbytes 11. Jul 2005 09:49

Re: LIKE
 
Hast Du mal probiert im Query Analyzer die Abfrage so auszuführen, also ohne Variablen?

Probier doch mal per ODBC das ganze in Access (oder irgendwas anderem) auszuführen.

Auch bei mir kommen unterschiedliche Werte mit AND oder OR raus.

Treffnix 11. Jul 2005 09:50

Re: LIKE
 
Das Statement ist definitiv in Ordnung. Es funktioniert ja auch unter MS-SQL. Habs ja sogar getestet. Also muss es an falschen/fehlenden Werten liegen.

Ansonsten bau das Statement mal hardcoded rein. Also

Delphi-Quellcode:
'SELECT * FROM FIRMA WHERE firmen_plz LIKE ''%9%'' OR firmen_bez LIKE ''%sch%' order by firmen_bez'

Schodn 11. Jul 2005 09:59

Re: LIKE
 
ES geht es geht, aber fragt nicht warum

danke euch alle für diese schwierige geburt



str_1 := '%' + str_1 + '%';
str_2 := '%' + str_2 + '%';

'SELECT * FROM FIRMA WHERE firmen_plz LIKE '''+str_1+''' AND firmen_bez LIKE '''+str_2+''' order by firmen_bez'


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:51 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz