Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Hilfe bei SQL Abfrage Firebird (https://www.delphipraxis.net/117444-hilfe-bei-sql-abfrage-firebird.html)

burn 18. Jul 2008 09:20

Datenbank: Firebird • Version: 1.5 • Zugriff über: Zeos-Komponenten

Hilfe bei SQL Abfrage Firebird
 
Hallo allerseits,

hätte da mal eine Frage zu einer SQL-Abfrage:

Delphi-Quellcode:

TextTeil1 := 'abc';
TextTeil2 := 'xyz';

s := AnsiUpperCase(TextTeil1 + '_' + TexTeil2 + '_');

QSuche.SQL.Add('Select Feld1, Feld2, Feld3 from Tabelle where ');
QSuche.SQL.Add('UPPER(FELD1 COLLATE DE_DE) like ' + QuotedStr(s));

...
Normalerweise sollte die Abfrage mir doch Ergebnisse wie
abcZxyzA, abcDxyzj, abc1xyz2 etc. liefern...

Steht jedenfalls da

Aber die Ergebnis-Menge bleibt leer. Die Frage: Hab ich irgendwas vergessen, nicht beachtet oder nicht verstanden ??

mfg Burn

mkinzler 18. Jul 2008 09:27

Re: Hilfe bei SQL Abfrage Firebird
 
Es fehlt der Joker
Delphi-Quellcode:
TextTeil1 := 'abc%';
Allerdings findet er dann alles was mit abc beginnet

burn 18. Jul 2008 09:32

Re: Hilfe bei SQL Abfrage Firebird
 
@ mkinzler

Richtig ... genau das wollte ich ja vermeiden ...

er soll eben nur die Datensätze finden die folgendermassen aufgebaut ist

TextTeil1 ...

dann etweder '/' oder '\' ...

dann TextTeil2 ...

dann ein beliebiger Buchstabe Bsp. a

Also abc\xyza oder abc/xyzB oder auch abc\xyzP

Vielleicht kann man die Abfrage auch anders gestalten ???

mfg Burn

mkinzler 18. Jul 2008 09:39

Re: Hilfe bei SQL Abfrage Firebird
 
Schreib dir eine UDF dafür oder FB ab 2.5.

burn 18. Jul 2008 09:50

Re: Hilfe bei SQL Abfrage Firebird
 
UDF fällt aus ... darf die DB nicht ändern ...
Oder kann man das auch ausserhalb der DB festlegen ???

Umstellung auf FB 2.5 wollen die Admins erst mal nicht machen ...

mfg Burn

mkinzler 18. Jul 2008 09:52

Re: Hilfe bei SQL Abfrage Firebird
 
Du must die Funktionen in die DB importieren. Fällt also aus.

nahpets 18. Jul 2008 10:08

Re: Hilfe bei SQL Abfrage Firebird
 
Hallo,

da fällt mit momentan nur eine blöde Frage ein:

Gibt es das, was Du suchst tatsächlich in der Datenbank?

Ist mit auch mal passiert, bin an der Abfrage verzweifelt, bis ich dann feststellte, dass das, was ich bitte dringend raussuchen sollte, garnicht vorhanden war.

Syntaktisch erscheint mir Deine Abfrage korrekt für die gestellte Aufgabe.

Je nach Datenbank wir bei Like nicht zwischen Groß- und Kleinschreibung unterschieden, versuch's mal ohne Upper.

Stephan

Hansa 18. Jul 2008 10:26

Re: Hilfe bei SQL Abfrage Firebird
 
Geht so was nicht ?

SQL-Code:
SELECT * FROM TABLEX WHERE (NAME CONTAINING 'abc' AND BEZ CONTAINING 'z')
Ist die Stelle an der der Substring steht von Bedeutung ?

burn 18. Jul 2008 10:33

Re: Hilfe bei SQL Abfrage Firebird
 
@ nahpets

Natürlich gibt es das was ich suche ...
Wenn die Abfrage lautet :

Delphi-Quellcode:
'Select Feld1,Feld2,Feld3 where UPPER(FELD1 COLLATE DE_DE) = ' + QuotedStr(AnsiUpperCase('abc\123a'))
dann kommt ein Ergebnis ...

Nur brauch ich das wie oben beschrieben ...

Und ohne Upper geht nicht, da für das Feld welches abgefragt wird, zu viele Schreibweisen vorhanden sind.

@ Hansa

siehe #3


mfg burn

Hansa 18. Jul 2008 10:46

Re: Hilfe bei SQL Abfrage Firebird
 
Bin mir ziemlich sicher, dass es einen SQL-Trick gibt, der mir gerade nicht einfällt. Aber im Zweifelsfall würde ich kurzen Prozess machen. :mrgreen: Lese notfalls die komplette Datenmenge mit möglichst großer Einschränkung. Also mit so was :
SQL-Code:
like 'abc%'
. Das dürfte dann nicht zuviel zurückliefern. Was dann noch übrigbleibt, das würde ich eben dann im Programm abfangen.

burn 18. Jul 2008 11:01

Re: Hilfe bei SQL Abfrage Firebird
 
@ Hansa

Die Abfrage 'abc%' würde ca 85 % aller Ergebnisse liefern...

Sagen wir mal so ... In dem Feld welches ich auswerten möchte kann man einen "Pfad" eingeben (muss man aber nicht)
Der Pfad fängt eben mit 'abc' an ...

Ich brauch in der Ergebnis-Menge :
alles was eben mit dem 'abc' anfängt ...
Danach kommt ein '\' oder auch ein '/'
dannach kommt eine 3-, 4- o. 5-stellige Zahl die aber evtl. noch ein Buchstabe enthält. Bsp 123a, 1234b, 12345X

Bsp:

ich Suche alles zu einer Zahl 12345 mit dem anfang 'abc' die dann Ergbnisse liefern muss wie:

abc/12345, abc\12345, abc\12345a, abc/12345X etc.

aber er soll nicht so sachen ausgeben wie:

abc/123a, abc\12346, abc\1244 etc.

mfg burn

mkinzler 18. Jul 2008 11:04

Re: Hilfe bei SQL Abfrage Firebird
 
Du könntest den Strinng per SQL auseinandernehmen und die Substrings filtern und
Oder Admin, wenn FB2.5 final verfügbar ist, zu dieser Version überreden, dann werden Reguläre Ausdrücke unterstützt.

Hansa 18. Jul 2008 11:25

Re: Hilfe bei SQL Abfrage Firebird
 
Zitat:

Zitat von burn
Die Abfrage 'abc%' würde ca 85 % aller Ergebnisse liefern...

Na, da siehste mal. :P Jetzt stellt sich nur noch die Frage, was mit den restlichen 15 % passiert. Wie gesagt : nicht lange fackeln. :mrgreen: Gehe diese 15 % im Dataset durch (Next,EOF usw.) und mache das dann mit copy, pos usw. im Programm. Ohne Einbau einer SP etc. in die DB sehe ich sonst keine Möglichkeit. Allerdings bieten sich auch noch monströs zusammengeschusterte SQL-Konstrukte an. Oder abwarten, was Alex517 sagt. :mrgreen:

mkinzler 18. Jul 2008 11:27

Re: Hilfe bei SQL Abfrage Firebird
 
@hansa: Diese Abfrage filtert nur 15% weg und lässt 85% übrig.

burn 18. Jul 2008 11:33

Re: Hilfe bei SQL Abfrage Firebird
 
@ Hansa

Siehste mkinzler versteht mich... :mrgreen:

mfg Burn

mkinzler 18. Jul 2008 11:34

Re: Hilfe bei SQL Abfrage Firebird
 
Hast du das mit dem Substringvergleich mal versucht?

burn 18. Jul 2008 11:40

Re: Hilfe bei SQL Abfrage Firebird
 
@mkinzler
Bis jetzt noch nicht dazu gekommen ...
Wie muss ich mir das vorstellen ???

mfg Burn

Hansa 18. Jul 2008 11:42

Re: Hilfe bei SQL Abfrage Firebird
 
Zitat:

Zitat von burn
@ Hansa

Siehste mkinzler versteht mich... :mrgreen:

Programmieren, faxen, telefonieren und Antwort schreiben auf einmal ist manchmal eben zuviel. :mrgreen: Gebe mal lieber die DB-Größe bekannt.

burn 18. Jul 2008 11:49

Re: Hilfe bei SQL Abfrage Firebird
 
Zitat:

Programmieren, faxen, telefonieren und Antwort schreiben auf einmal ist manchmal eben zuviel.
Frauen sollen das ja schaffen ... :lol:

Größe der DB : 3.16 GB
Für was ist das wichtig ???

mfg Burn

mkinzler 18. Jul 2008 11:57

Re: Hilfe bei SQL Abfrage Firebird
 
Zitat:

Wie muss ich mir das vorstellen ???
SQL-Code:
... where upper(substring( name from 1 for 3)) = 'ABC' and ...

Hansa 18. Jul 2008 11:58

Re: Hilfe bei SQL Abfrage Firebird
 
Zitat:

Zitat von burn
Für was ist das wichtig ???

Anzahl der Datensätze, ungefähr ? Ich will einschätzen können, ob es überhaupt produktiv ist, das unbedingt über die DB zu machen. Frauen gehören um die Uhrzeit aber besser in die Küche. :duck:

nahpets 18. Jul 2008 12:10

Re: Hilfe bei SQL Abfrage Firebird
 
Hallo Burn,

die Frage mit dem Vorhandensein von entsprechenden Daten, meinte ich nicht böse, sorry, wenn es so rübergekommen ist.

Das darf sein:
  • abc/12345
    abc\12345
    abc\12345a
    abc/12345X
das darf nicht sein:
  • abc/123a
    abc\12346
    abc\1244
Deine Abfrage geht auf:
  • abc_xyz
d. h.:

Es werden nur Inhalte verglichen, bei denen in Feld1 ein Wert steht, der genau 7 Zeichen lang ist. Demnach wird hier keiner der von Dir aufgeführten falschen Werte gefunden.

Ausgehend von Deinen Beispieldaten gehe ich einmal davon aus, das Dir 3 Zeichen vor / und \ bekannt sind,
das dann 5 Ziffern und eventuell ein Buchstabe folgen.

Damit kommen wir eventuell weiter:

Wir setzen in den Filter das, was richtig ist:
Delphi-Quellcode:
TextTeil1 := 'abc';
TextTeil2 := '12345';

s := AnsiUpperCase(TextTeil1 + '_' + TextTeil2 + '_');
sagen der Datenbank aber, dass wir genau das nicht gefunden haben wollen, indem wir vor das like ein NOT stellen:
Delphi-Quellcode:
QSuche.SQL.Add('Select Feld1, Feld2, Feld3 from Tabelle where ');
QSuche.SQL.Add('UPPER(FELD1 COLLATE DE_DE) NOT like ' + QuotedStr(s));
Hoffe, das bringt Dich jetzt weiter.

Stephan

burn 18. Jul 2008 12:18

Re: Hilfe bei SQL Abfrage Firebird
 
@mkinzler

Das teste ich heut abend mal aus ... jetzt leider keine Zeit ...

@Hansa

DB -> 105 Tabellen -> Die Tabelle die ich abfrage hat im Moment ca. 50000 Datensätze

@nahpets

Zitat:

die Frage mit dem Vorhandensein von entsprechenden Daten, meinte ich nicht böse, sorry, wenn es so rübergekommen ist.
Ist es nicht ...

Zitat:

ausgehend von Deinen Beispieldaten gehe ich einmal davon aus, das Dir 3 Zeichen vor / und \ bekannt sind,
das dann 5 Ziffern und eventuell ein Buchstabe folgen.
5 ziffern oder 4 Ziffern oder 3 Ziffern bald auch 6 Ziffern ...
und dann etweder mit Buchstabe oder auch ohne ...

Also wird das nix mit der Abfrage mit NOT.


mfg Burn

burn 18. Jul 2008 12:39

Re: Hilfe bei SQL Abfrage Firebird
 
@mkinzler

Hab mir doch mach schnell die Zeit genommen für eine Testabfrage mit den Substring..
(Lassen wir mal meine eigentliche Arbeit einfach liegen :mrgreen:)

Das könnte tatsächlich funzen ... werde das aber heute abend nochmal genauer untersuchen.
Danke Dir schon mal den Tip...



Melde mich wieder falls das Problem noch nicht behoben sein sollte..

Auch Dank an die anderen die mir helfen wollten ... :dp:

Schönes WE ...

mfg Burn

mkinzler 18. Jul 2008 12:43

Re: Hilfe bei SQL Abfrage Firebird
 
Ist halt nicht so performant

nahpets 18. Jul 2008 12:54

Re: Hilfe bei SQL Abfrage Firebird
 
Hallo,

heute bin ich schwer von Begriff:

Das darf sein (wobei a für einen beliebige Buchstaben steht)?
  • abc/123
    abc\123
    abc/123a
    abc\123a
    abc/1234
    abc\1234
    abc/1234a
    abc\1234a
    abc/12345
    abc\12345
    abc/12345a
    abc\12345a
    abc/123456
    abc\123456
    abc/123456a
    abc\123456a
Was vor dem / und \ stehen ist (für eine Abfrage) immer gleich?
Sind die ersten drei Zeichen hinter / und \ auch immer gleich?

Würde das bedeuten, dass die von Dir gesuchten Werte immer kleiner oder größer als Dein Suchbegriff wären?

Dann könnte das helfen:
SQL-Code:
select * from tabelle
where upper(feld1 collate DE_DE) < upper('abc/12345')
or   upper(feld1 collate DE_DE) > upper('abc/12345z')
or   upper(feld1 collate DE_DE) < upper('abc\12345')
or   upper(feld1 collate DE_DE) > upper('abc\12345z')
Stephan

burn 18. Jul 2008 13:00

Re: Hilfe bei SQL Abfrage Firebird
 
@mkinzler
Jep hab ich grad gemerkt ...

Und noch ein Problem tritt auf:

Wie mach ich das: ich will alles zu 123 finden:

also 123, 123a, 123b

aber nicht 1234, 1235 etc


@ stephan

Das teste ich alles heut abend ... ich glaub mein Hirn platzt gleich :wall:
zu viel Input :mrgreen:

Zitat:

Was vor dem / und \ stehen ist (für eine Abfrage) immer gleich?
Sind die ersten drei Zeichen hinter / und \ auch immer gleich?
1. Ja -> nur verschiedene Schreibeweisen Bsp: abc, ABC, aBc Abc etc
2. nein.

mfg Burn

mkinzler 18. Jul 2008 13:11

Re: Hilfe bei SQL Abfrage Firebird
 
SQL-Code:
... where Upper(name) Starting with 'ABC' and upper(substring( name from 4 for 1)) in ('A'..'Z') and ...

burn 18. Jul 2008 13:26

Re: Hilfe bei SQL Abfrage Firebird
 
@ mkinzler
Zitat:

upper(substring( name from 4 for 1)) in ('A'..'Z')
hier meckert mich mein Prog. an ... anscheinend wird das in ('A'..'Z') nicht unterstüzt

edit :

Aber es geht
Delphi-Quellcode:
in ('A','B','C','D')
Und nun is Ende Gelände ... Muss erstmal den ganzen Input von heute aufn Punkt bringen...
Und dann schaun mer mal..

Nu aber wirklich ... Schönes WE ...

:dp:


mfg Burn

mkinzler 18. Jul 2008 13:47

Re: Hilfe bei SQL Abfrage Firebird
 
Oh war ja Delphi Syntax
aber
SQL-Code:
Between 'A' and 'Z'
sollte gehen

burn 18. Jul 2008 13:53

Re: Hilfe bei SQL Abfrage Firebird
 
@ mkinzler

Es geeeeeeeeht, es geeeeeeht ... ich wär bekloppt. Ich drück aufn Knop und es geeeeeht ...

Besten Dank nun sollte ich zurecht kommen ....

mfg Burn


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:41 Uhr.

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