Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Optimierung einer SQL-Abfrage (https://www.delphipraxis.net/122097-optimierung-einer-sql-abfrage.html)

barnti 9. Okt 2008 12:30

Datenbank: Oracle • Version: 10g • Zugriff über: plsql

Optimierung einer SQL-Abfrage
 
Hallo Gemeinde,

ich habe heute mal wieder eine Frage zum Thema Datenbanken. Folgende Problemstellung:

ich habe eine 11-stellige Nummer, die ich mit Einträgen aus einer Tabelle vergleichen möchte. Dabei möchte ich nicht nur die aktuelle Nummer gegen die Tabelle testen sondern auch verkürzte Bestandteile.

z.B:

1. Test: ist die Nummer 08154711059 in Tabelle A vorhanden? Wenn ja, Suche abbrechen, wenn nein

2. Test: ist die Nummer 0815471105 in Tabelle A vorhanden? Wenn ja, Suche abbrechen, wenn nein suche nächste verkürzte Nummer(bis Länge(Nummer) <= 4)


Bisher iteriere ich in einer Schleife über die zu suchenden Nummer und übergebe diese einem Cursor, der die Abfrage ausführt. Ich hätte nun gern gewusst, wie ich das optimieren kann?

Hat jemand eine Idee?

Bernhard Geyer 9. Okt 2008 12:32

Re: Optimierung einer SQL-Abfrage
 
Wie wäre es mit IN?

SQL-Code:
SELECT * FROM <Tabelle> where Suchfeld in [Wert1, Wert2, ...];

DeddyH 9. Okt 2008 12:37

Re: Optimierung einer SQL-Abfrage
 
Dann erhält man aber u.U. mehrere Datensätze, sonst könnte man auch gleich auf die Minimallänge kürzen und mit like suchen.

[edit] Um 1337 gepostet, ob das was zu sagen hat? :mrgreen: [/edit]

barnti 9. Okt 2008 12:38

Re: Optimierung einer SQL-Abfrage
 
Hallo Bernhard,

Danke für die schnelle Antwort!

Daran hatte ich auch schon gedacht. Aber wie übergebe ich dann die Werte an das Select-Statement? Es kann auch vorkommen, dass eine Nummer mal kürzer ist, so dass ich da keine feste Variablenzahl nehmen kann. Kann ich die Werte irgendwie in ein Array schreiben und dann mit WHERE IN vergleichen? Kannst Du das evtl. etwas genauer beschreiben?

barnti 9. Okt 2008 12:39

Re: Optimierung einer SQL-Abfrage
 
Hi,

Zitat:

Zitat von DeddyH
Dann erhält man aber u.U. mehrere Datensätze, sonst könnte man auch gleich auf die Minimallänge kürzen und mit like suchen.

Like Vergleich geht leider nicht. Ich will ja nicht jede beliebige Nummer finden, sondern immer die aktuell zu suchende.

DeddyH 9. Okt 2008 12:42

Re: Optimierung einer SQL-Abfrage
 
Das Problem hast Du bei der Suche mit IN aber auch, das war ja meine Aussage oben.

barnti 9. Okt 2008 12:46

Re: Optimierung einer SQL-Abfrage
 
Hallo,

Zitat:

Zitat von DeddyH
Das Problem hast Du bei der Suche mit IN aber auch, das war ja meine Aussage oben.

Ich denke, das ist so nicht richtig. Wenn ich einzelne Werte mit WHERE IN vergleiche bekomme ich auch nur diskrete Treffer Für diese Werte. Will heißen:

Wert1: 08154711
Wert2: 0815471
Wert3: 081547

Dann bekomme ich nur Treffer, wenn Wert1 oder Wert2 oder Wert3 in der TAbelle enthalten ist (kein exor wohlgemerkt).

DeddyH 9. Okt 2008 12:48

Re: Optimierung einer SQL-Abfrage
 
Sry, dann habe ich die Aufgabenstellung falsch verstanden.

[edit] Soll der SQL-String in Delphi generiert werden? [/edit]

DeddyH 9. Okt 2008 13:03

Re: Optimierung einer SQL-Abfrage
 
Hab mal was gebastelt:
Delphi-Quellcode:
function SeekSQL(const sNumber: string; MinLength: integer = 1): string;
var i: integer;
    sl: TStringList;
begin
  Result := '';
  sl := TStringList.Create;
  try
    for i := Length(sNumber) downto MinLength do
      sl.Add(QuotedStr(Copy(sNumber,1,i)));
    Result := sl.CommaText;
  finally
    sl.Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
const sSQL = 'SELECT * FROM Tabelle WHERE Suchfeld IN (%s)';
begin
  ShowMessage(Format(sSQL,[SeekSQL('08154711059',4)]));
end;

barnti 9. Okt 2008 13:12

Re: Optimierung einer SQL-Abfrage
 
Hi-ho,

ja so in der Art wäre fein. Ich habe nur noch keine Möglichkeit gefunden, das in Pl/Sql zu implementieren. Vararray geht als Typ im Statement nicht(Cursor).


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:52 Uhr.
Seite 1 von 4  1 23     Letzte »    

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