Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Trim-Funktion bei Select-Abfrage? (https://www.delphipraxis.net/122743-trim-funktion-bei-select-abfrage.html)

WIng2005 21. Okt 2008 13:39

Datenbank: PostgreSQL • Zugriff über: zeos

Trim-Funktion bei Select-Abfrage?
 
Hallo Gemeinde,

ich versuche gerade, die Ergebnismenge einer Select-Abfrage um fehrende Lehrzeichen zu bereinigen. Hatte schon ein wenig geggogelt, meine aber, dass ich ein wenig auf dem Holzweg bin. Also sowas in der Art schwebt mir vor:

Delphi-Quellcode:
SELECT TRIM(a) FROM b WHERE a='x'

oder

SELECT a FROM b WHERE TRIM(a)='x'

vermeiden möchte ich:

SELECT a FROM b WHERE (a='x') or (a=' x')
Hintergrund ist, dass ich eine Spalte einer Tabelle abfragen möchte, deren Werte mal ein führendes Leerzeichen enthalten, und mal nicht. Die Variable x enthält ein solches nie. Mir scheint jedoch, dass TRIM nicht sonderlich geeignet ist hierfür....hoffe, dass mir jemand helfen kann.


MFG
Steffen

alzaimar 21. Okt 2008 13:43

Re: Trim-Funktion bei Select-Abfrage?
 
Überlege Dir, wie ein Index Dir helfen könnte.

Wenn die Spalte über einen Index verfügt, und Die nur ein oder zwei führende Leerzeichen hast, dann würde ich eine Abfrage mit OR wählen. Das geht am schnellsten.

Ansonsten bleibt dir nur die Abfrage mit "WHERE TRIM(A)='x'" und die Erkenntnis, das man Daten *vor* dem Abspeichern normalisieren sollte, damit man sie später auch schnell wieder findet.

WIng2005 21. Okt 2008 13:47

Re: Trim-Funktion bei Select-Abfrage?
 
Naja, die Daten selbst sind nicht meinem Ursprung. Das Führende Leerzeichen identifiziert best. Produktgruppen.
Um jedoch flexibel abzufragen (x kann dabei für Teilenummern verschiedener Produktgruppen stehen) dachte ich an die Trim-Funktion. Leider funktioniert dass nur so nicht......

MFG
Steffen

alzaimar 21. Okt 2008 13:52

Re: Trim-Funktion bei Select-Abfrage?
 
Was funktioniert nicht?
Ich würde es mit einem 'OR' versuchen, da es sich nur um eine Alternative handelt (mit einem Leerzeichen/ ohne Leerzeichen).

Du kannst auch ein Union verwenden, das wird imho aber langsamer:
SQL-Code:
Select * from Tabelle where Spalte = 'x'
union
Select * from Tabelle where Spalte = ' x'

nahpets 21. Okt 2008 13:55

Re: Trim-Funktion bei Select-Abfrage?
 
Hallo,

ausgehend von Deiner Fragestellung vermute ich mal:
SQL-Code:
SELECT Trim(a) FROM b WHERE Trim(a) = 'x'
Du scheinst ja sowohl bei der Wherebedingung ohne führendes Blank suchen zu wollen und die Ergebnismenge auch ohne führendes Blank zu erwarten.
In Bezug auf Ergebnismenge wäre natürlich das
SQL-Code:
SELECT TRIM(a) FROM b WHERE a='x'
richtig, berücksichtigt wird das führende Blank aber nicht bei der Auswahl der Ergebnismenge. In diesem Beispiel ist das Trim überflüssig, da ja die Wherebedingung nur Werte ohne führendes Blank liefert. Bei
SQL-Code:
SELECT TRIM(a) FROM b WHERE a=' x'
wäre das Trim aber angebracht, da hier ja Werte mit führendem Blank geliefert werden. Mit
SQL-Code:
SELECT Trim(a) FROM b WHERE Trim(a) = 'x'
schlägst Du dann beide Fliegen mit einer Klappe, aber unter Umgehung des Index, es sei denn, es gäbe eine Indexdefinition a la:
SQL-Code:
create index OhneBlankA on b (Trim(a))
Falls sowas in der Art mit Postgres gehen sollte.

Inwieweit sind Werte mit führendem Blank in der Datenbank denn sinnvoll?
Wenn sie nicht sinnvoll sind, dann vor dem Speichern führende Blanks entfernen, ggfls. auch per Datenbanktrigger.

WIng2005 21. Okt 2008 13:59

Re: Trim-Funktion bei Select-Abfrage?
 
Mmmmh, Fehler(?) gefunden:

Delphi-Quellcode:
ich hatte:

SELECT a FROM b WHERE TRIM(a) = 'x'

ich sollte haben:

SELECT a FROM b WHERE TRIM(a,' ')='x'
Schaut aber schon ein wenig komisch aus..... jhabe ich zumindest so noch nicht gefunden.


Die Datenbank ist von unserem ERP, da habe ich wenig Einfluß drauf. Wie gesagt kennzeichnet das führende Blank eine spez. Warengruppe. Das zu ändern bekomme ich nicht durch.

MFG
Steffen

nahpets 21. Okt 2008 14:13

Re: Trim-Funktion bei Select-Abfrage?
 
Hallo,
Zitat:

Zitat von WIng2005
Delphi-Quellcode:
ich hatte:

SELECT a FROM b WHERE TRIM(a) = 'x'

ich sollte haben:

SELECT a FROM b WHERE TRIM(a,' ')='x'

hab' das gerade mal ausprobiert: Trim(a) sollten eigentlich Blanks entfernen (siehe postgresql/.../functions-string), mit Trim(a,'*') könnte man halt führende und folgende * entfernen.

WIng2005 21. Okt 2008 14:26

Re: Trim-Funktion bei Select-Abfrage?
 
Eigentlich hast du recht. Wenn ich jedoch Trim(a) im pgAdmin versuche, meckert er über fehlende Parameter.
Habe es mal im Delphi probiert, was auch nicht funktionierte. Trim(a,' ') wiederum geht auch hier.


MFG
Steffen

nahpets 21. Okt 2008 14:42

Re: Trim-Funktion bei Select-Abfrage?
 
Zitat:

Zitat von WIng2005
Wenn ich jedoch Trim(a) im pgAdmin versuche, meckert er über fehlende Parameter.

Bei mir meckert der nicht (Postgres 8.3), hast Du eventuell eine älter Datenbankversion?

nahpets 21. Okt 2008 14:44

Re: Trim-Funktion bei Select-Abfrage?
 
Zitat:

Zitat von WIng2005
Wenn ich jedoch Trim(a) im pgAdmin versuche, meckert er über fehlende Parameter.

Bei mir meckert der nicht (Postgres 8.3), hast Du eventuell eine älter Datenbankversion?


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:19 Uhr.
Seite 1 von 2  1 2      

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