Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Werte in einem Datenbankfeld prüfen? (https://www.delphipraxis.net/155014-werte-einem-datenbankfeld-pruefen.html)

romber 5. Okt 2010 10:56

Datenbank: MSSQL Sever • Version: 2008 • Zugriff über: ADO

Werte in einem Datenbankfeld prüfen?
 
Hallo!

Ich habe mit den Datenbanken bis jetzt nur sehr selten etwas gemacht und das waren auch ganz simple Sachen. Nun habe ich ein Datenbankfeld vom Typ varchar, das kommagetrennte Zahlenwerte enthält und muss beim SELECT prüfen, ob bestimmte Zahlenwerte in diesem Feld vorhanden sind. Z.B. hier das Inhalt des Feldes: 25,11,144,108,115,6,34. Ich muss prüfen, ob die Werte 144, 28 und 136 drin sind. Wie mache ich das?

DeddyH 5. Okt 2010 10:59

AW: Werte in einem Datenbankfeld prüfen?
 
Ist die DB-Struktur von Dir? Falls ja, dann ändere sie, kommaseparierte Werte in einem Feld lassen so gut wie immer auf schlechtes Design (unzureichende Normalisierung) schließen.

Sir Rufo 5. Okt 2010 11:03

AW: Werte in einem Datenbankfeld prüfen?
 
Ist es gegeben dann prüfe wie folgt
Code:
where Feld like "144,%" or Feld like "%,144,%" or Feld like "%,144"
Jetzt kannst du das erweitern, dass er auch die anderen Werte prüft

DeddyH 5. Okt 2010 11:06

AW: Werte in einem Datenbankfeld prüfen?
 
Und damit würde er auch 1144, 2144 usw. ermitteln.

Sir Rufo 5. Okt 2010 11:07

AW: Werte in einem Datenbankfeld prüfen?
 
Zitat:

Zitat von DeddyH (Beitrag 1053866)
Und damit würde er auch 1144, 2144 usw. ermitteln.

Dann erklär mir bitte warum er das machen sollte

DeddyH 5. Okt 2010 11:09

AW: Werte in einem Datenbankfeld prüfen?
 
Brille nicht geputzt, ich hab da ein "%" gesehen, wo keins war :mrgreen:. Nichtsdestotrotz ist das mehr als suboptimal, an seiner Stelle würde ich mit dem DB-Designer mal ein ernstes Wort reden (falls er es nicht selbst ist).

romber 5. Okt 2010 11:17

AW: Werte in einem Datenbankfeld prüfen?
 
Vielen Dank für die schnelle Raktionen!

Zitat:

Zitat von DeddyH (Beitrag 1053868)
...an seiner Stelle würde ich mit dem DB-Designer mal ein ernstes Wort reden (falls er es nicht selbst ist).

Doch, das bin ich...:oops:
Wie soll ich es wieder gut machen? Soll ich am besten für jede Zahlenwert eins Feld erstellen, wenn ich eine alle möglichen Zahlenwerte kenne? Denn genau das wollte ich vermeiden. Ich habe 155 Werte, für die ich dann jeweils einen Feld erstellen muss.

Sir Rufo 5. Okt 2010 11:17

AW: Werte in einem Datenbankfeld prüfen?
 
Ich stimme dir ja zu, was das Design angeht, aber manchmal hat man da Null Einfluß drauf ;)

Sir Rufo 5. Okt 2010 11:20

AW: Werte in einem Datenbankfeld prüfen?
 
Zitat:

Zitat von romber (Beitrag 1053869)
Vielen Dank für die schnelle Raktionen!

Zitat:

Zitat von DeddyH (Beitrag 1053868)
...an seiner Stelle würde ich mit dem DB-Designer mal ein ernstes Wort reden (falls er es nicht selbst ist).

Doch, das bin ich...:oops:
Wie soll ich es wieder gut machen? Soll ich am besten für jede Zahlenwert eins Feld erstellen, wenn ich eine alle möglichen Zahlenwerte kenne? Denn genau das wollte ich vermeiden. Ich habe 155 Werte, für die ich dann jeweils einen Feld erstellen muss.

Nein, erstelle eine Zusätzliche Tabelle mit einer Parent Spalte und der Wert Spalte

DeddyH 5. Okt 2010 12:40

AW: Werte in einem Datenbankfeld prüfen?
 
Richtig, evtl. dann noch die Kombination dieser beiden Felder als UNIQUE oder gleich als PrimaryKey definieren, das sorgt für Eindeutigkeit (sofern gewünscht, ich kenne ja die Anforderung nicht).

romber 5. Okt 2010 13:41

AW: Werte in einem Datenbankfeld prüfen?
 
Zitat:

Zitat von Sir Rufo (Beitrag 1053871)
Nein, erstelle eine Zusätzliche Tabelle mit einer Parent Spalte und der Wert Spalte

Parent ist dan der Datensatz, zu dem der Wert gehört? Verstehe ich das richtig?

DeddyH 5. Okt 2010 13:42

AW: Werte in einem Datenbankfeld prüfen?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ja, Parent ist ein Fremdschlüssel auf den Primärschlüssel der Mastertabelle.

[edit] Hab mal ein Bild angehangen [/edit]

romber 5. Okt 2010 17:23

AW: Werte in einem Datenbankfeld prüfen?
 
Vielen Dank für dieses Bild!
Noch eine Frage dazu: ab und zu werden die Datensätze aktuallisiert. Die Zahlenwerte werden in der Regel auch geändert, einige neue Werte kommen dazu und einige fallen weg. Bisher musste ich einfach den neuen Inhalt mit kommagertrennten Zahlenwerten eintragen und das war's auch. Wie mache ich das am besten, wenn ich die Werte in einer separaten Tabelle ablege? Soll ich beim Aktuallisieren alle zugehörige Werte aus Detailstabelle entfernen und dann die neue eintragen, oder gibt es eine elegantere Methode?

DeddyH 6. Okt 2010 09:56

AW: Werte in einem Datenbankfeld prüfen?
 
Bei den zu löschenden ist es ja klar. Für neue oder zu aktualisierende Datensätze bietet sich die UPDATE OR INSERT INTO-Syntax an (das ist allerdings eine Firebird-Spezialität, ob MSSQL etwas ähnliches auch bietet, entzieht sich meiner Kenntnis). Dazu ist es aber wahrscheinlich etwas einfacher, der Detailtabelle einen künstlichen Primärschlüssel zu spendieren und die Kombination der anderen beiden Felder als UNIQUE zu definieren.

romber 17. Okt 2010 22:46

AW: Werte in einem Datenbankfeld prüfen?
 
Zitat:

Zitat von DeddyH (Beitrag 1054065)
Bei den zu löschenden ist es ja klar.

Verstehe ich das richtig, ich muss zuerst prüfen, welche Zahlenwerte der zu aktualisierende Datensätz nicht mehr hat, diese in der Details-Tabelle ermitteln und löschen? Wird es nicht einfacher und auch schneller, alle Werte des Datensasatzes aus der Tabelle zu löschen und die neue zu inserieren?

Sir Rufo 17. Okt 2010 23:11

AW: Werte in einem Datenbankfeld prüfen?
 
Zitat:

Zitat von romber (Beitrag 1056254)
Zitat:

Zitat von DeddyH (Beitrag 1054065)
Bei den zu löschenden ist es ja klar.

Verstehe ich das richtig, ich muss zuerst prüfen, welche Zahlenwerte der zu aktualisierende Datensätz nicht mehr hat, diese in der Details-Tabelle ermitteln und löschen? Wird es nicht einfacher und auch schneller, alle Werte des Datensasatzes aus der Tabelle zu löschen und die neue zu inserieren?

Jein ;) in diesem Fall ist es aber wahrscheinlich egal
Wichtig hierbei ist aber auf jeden Fall das Übertragen innerhalb einer Transaktion durchzuführen.
Delphi-Quellcode:
ADOConnection1.BeginTrans; // Transaktion starten
{... Daten zur Datenbank übertragen ...}
ADOConnection1.Commit; // Transaktion abschließen
Alternativ zum Löschen und wieder komplett schreiben kann man auch mit einer temporären Tabelle arbeiten.
In diese trägt man alle Daten ein und macht dann den Abgleich mit SQL.
Dieses ist wesentlich ressourcenschonender, da hierbei nur die Veränderungen in der Tabelle gespeichert/gelöscht werden.

Die Transaktion bleibt aber auch hierbei Pflicht.

romber 18. Okt 2010 08:23

AW: Werte in einem Datenbankfeld prüfen?
 
Zitat:

Zitat von Sir Rufo (Beitrag 1056255)
Alternativ zum Löschen und wieder komplett schreiben kann man auch mit einer temporären Tabelle arbeiten.
In diese trägt man alle Daten ein und macht dann den Abgleich mit SQL.
Dieses ist wesentlich ressourcenschonender, da hierbei nur die Veränderungen in der Tabelle gespeichert/gelöscht werden.

Wie macht man das am besten? Tempräre Tabelle erstellen kann ich. Wie funktoniert der Abgleicht mittels SQL?


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