Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi [SQL] where-Clause auf Stringfeld, in dem nur Zahlen stehen (https://www.delphipraxis.net/68309-%5Bsql%5D-where-clause-auf-stringfeld-dem-nur-zahlen-stehen.html)

el toppo 27. Apr 2006 17:40

Datenbank: Firebird • Version: 1.5 • Zugriff über: BDE

[SQL] where-Clause auf Stringfeld, in dem nur Zahlen stehen
 
Hallo,

ich bräuchte mal bitte einen kleinen Tip.

Ich hab eine Artikeldatenbank, in der das Feld Artikelnummer ein String-Feld ist. Jetzt möchte ich alle Artikel haben, bei denen die Artikelnummer nur aus Zahlen besteht. Es gibt also Artikel, die haben in der Artikelnummer Buchstaben, Leer- und Sonderzeichen. Und das in jeder erdenklichen Konstelation. All diese Artikel möchte ich löschen.
Ich komm aber einfach nicht weiter, das in einer einzigen SQL-Abfrage unterzubringen.
Der erste Gedanke war ein Cast auf die Artikelnummer in Integer, aber da das ganze in ein Script soll, kann ich da leider nicht auf Fehler reagieren, wenn einer auftritt, stopt das Script.

Habt Ihr nen Tip, wie man sowas bewerkstelligen könnte?

Grüsse vom
el Toppo

mkinzler 27. Apr 2006 18:02

Re: [SQL] where-Clause auf Stringfeld, in dem nur Zahlen ste
 
Das Problem wird sich nur mit einer SP lösen lassen.

shmia 27. Apr 2006 18:08

Re: [SQL] where-Clause auf Stringfeld, in dem nur Zahlen ste
 
Du kannst auch mehrere DELETE Anweisungen nacheinander absetzen.
SQL-Code:
DELETE FROM Artikel WHERE IdArtikel <> Trim(IdArtikel)
Wenn deine Artikelnummer z.B. immer 10-stellig ist:
SQL-Code:
DELETe FROM Artikel WHERE IdArtikel > '9999999999' OR IdArtikel < '0000000000'
So werden die ungeliebten Daten Schritt für Schritt entsorgt.
Vielleicht solltest du aber ein neues Feld "delFlag" einführen.
Dann kannst du zuerst mit UPDATE das Feld setzen, bevor du durch ein falsches DELETE Kommando deine Daten riskierst:
SQL-Code:
UPDATE Artikel SET delFlag=1 WHERE IdArtikel <> Trim(IdArtikel)
und dann später werden alle Löschkandidaten gelöscht:
SQL-Code:
DELETE FROM Artikel WHERE delFlag <> 0

alzaimar 27. Apr 2006 18:21

Re: [SQL] where-Clause auf Stringfeld, in dem nur Zahlen ste
 
SQL-Code:
select * from Artikel
 where not (
    ArtikelNr like '%A%'
    or ArtikelNr like '%B%'
    or ArtikelNr like '%C%'
...
    or ArtikelNr like '%Z%'
)
sollte doch funktionieren. Soweit ich weiss, ignoriert der LIKE-Operator die Gross/Kleinschreibung. Wenn nicht, müssen eben noch 26 LIKE-Klauseln mit den Kleinbuchstaben herhalten...

el toppo 27. Apr 2006 18:29

Re: [SQL] where-Clause auf Stringfeld, in dem nur Zahlen ste
 
Zitat:

Zitat von mkinzler
Das Problem wird sich nur mit einer SP lösen lassen.

Sowas befürchte ich auch schon.


Zitat:

Zitat von shmia
Du kannst auch mehrere DELETE Anweisungen nacheinander absetzen.
SQL-Code:
DELETE FROM Artikel WHERE IdArtikel <> Trim(IdArtikel)

Damit bekomme ich dann alle Artikel, die vor oder nach der Artikelnummer ein Leerzeichen haben. Und dann :gruebel:

Zitat:

Zitat von shmia
Wenn deine Artikelnummer z.B. immer 10-stellig ist:
SQL-Code:
DELETe FROM Artikel WHERE IdArtikel &gt; '9999999999' OR IdArtikel &lt; '0000000000'

Das funzt aber nicht, weil das Feld ein String-Feld ist, und die Sortierung alphanumerisch ist.

Zitat:

Zitat von shmia
So werden die ungeliebten Daten Schritt für Schritt entsorgt.

Da habe ich zweifel, ob ich so zum gewünschten Ergebnis komme.

Zitat:

Zitat von shmia
Vielleicht solltest du aber ein neues Feld "delFlag" einführen.
Dann kannst du zuerst mit UPDATE das Feld setzen, bevor du durch ein falsches DELETE Kommando deine Daten riskierst:
SQL-Code:
UPDATE Artikel SET delFlag=1 WHERE IdArtikel &lt;&gt; Trim(IdArtikel)
und dann später werden alle Löschkandidaten gelöscht:
SQL-Code:
DELETE FROM Artikel WHERE delFlag &lt;&gt; 0

Gibt es :thumb: Und nen Haufen DaSi

Zitat:

Zitat von alzaimar
SQL-Code:
select * from Artikel
 where not (
    ArtikelNr like '%A%'
    or ArtikelNr like '%B%'
    or ArtikelNr like '%C%'
...
    or ArtikelNr like '%Z%'
)
sollte doch funktionieren. Soweit ich weiss, ignoriert der LIKE-Operator die Gross/Kleinschreibung. Wenn nicht, müssen eben noch 26 LIKE-Klauseln mit den Kleinbuchstaben herhalten...

Momentan wird genau so auf ein vom Benutzer einzugebendes Zeichen reagiert, bzw. der Artikel mit dem Zeichen wird gelöscht.
Als ich das so in meinem Script machen wollte, bin ich dann aber an den Sonderzeichen gescheitert, weil alle möglichen Sonderzeichen in der Artikelnummer vorkommen können. Das mit Groß und Klein ist kein Problem die Artikelnummer ist Uppercase.

Danke schonmal

Grüsse vom
el Toppo


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:36 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