AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Alphanumerische Werte eingrenzen (ähnlich Between)
Thema durchsuchen
Ansicht
Themen-Optionen

Alphanumerische Werte eingrenzen (ähnlich Between)

Ein Thema von blawen · begonnen am 13. Sep 2015 · letzter Beitrag vom 14. Sep 2015
Antwort Antwort
Seite 2 von 3     12 3      
idefix2

Registriert seit: 17. Mär 2010
Ort: Wien
1.027 Beiträge
 
RAD-Studio 2009 Pro
 
#11

AW: Alphanumerische Werte eingrenzen (ähnlich Between)

  Alt 14. Sep 2015, 08:22
Statt eine Exception abzufangen könntest du doch mit trystrtoint überprüfen, ob dein SerNr_Start rein numerisch oder alphanumerisch ist,und entsprechend mit der ersten oder mit der zweiten Abfrageversion weitermachen.

Geändert von idefix2 (14. Sep 2015 um 08:26 Uhr)
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#12

AW: Alphanumerische Werte eingrenzen (ähnlich Between)

  Alt 14. Sep 2015, 08:47
Selbst wenn der Vergleich von Strings unterstützt wird, ist das Ergebnis bei variabler Stellenanzahl für die Abfrage nicht unbedingt hilfreich:

"B1" < "B100" < "B11" < "B2"

Eine allgemein gültige Lösung ist nur durch Trennung des Präfix von der Zählnummer möglich.

Man könnte schon in der Tabelle zwei zusätzliche Spalten dafür anlegen, die Spalte für die vollständige Nummer würde ich aber trotzdem vorsehen:
- "D1" || 20 -> "D120" und "D" || 120 wird ebenfalls "D120", ein eindeutiger Index über die vollständige Artikelnummer verhindert das.
- Eventuell gibt es eine Bildungsvorschrift mit fester Stellenanzahl für den numerischen Teil "D" || 20 -> "D020"

Alternativ berechnet man den numerischen Teil der Nummer zur Laufzeit in einer Funktion oder View.
Nachteil:
- Bildungsvorschriften können sich im Laufe der Zeit ändern, oder es existieren sogar unterschiedliche je Präfix.
- So kann der Index für die Nummer nicht genutzt werden.

Deshalb halte ich die erste Variante für günstiger.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#13

AW: Alphanumerische Werte eingrenzen (ähnlich Between)

  Alt 14. Sep 2015, 12:18
mal ganz dumm gefragt, warum packst Du eigentlich alle Bedingungen in das JOIN?
U.U bist Du so erfolgreicher:
Code:
Select * 
from REPARATUR JOIN MATERIAL ON (REPARATUR.MATERIAL_ID = MATERIAL.MATERIAL_ID)
Where ganzvielebedingungen......
Einige Datenbanken(/treiber) verschlucken sich an großen JOINs.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#14

AW: Alphanumerische Werte eingrenzen (ähnlich Between)

  Alt 14. Sep 2015, 13:13
Dem stimme ich zu, nur ganz selten macht es Sinn Bedingungen in den Join statt in die Where-Clause zu nehmen. Meine Lösung für ein ähnliches Problem war:

SQL-Code:
WHERE (right(tblfebg.Kennung,4) >= 1000)
AND (right(tblfebg.Kennung,4) < 2000)
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)
  Mit Zitat antworten Zitat
Benutzerbild von frankyboy1974
frankyboy1974

Registriert seit: 7. Apr 2015
Ort: SH
169 Beiträge
 
Delphi XE7 Professional
 
#15

AW: Alphanumerische Werte eingrenzen (ähnlich Between)

  Alt 14. Sep 2015, 13:26
hallo,

@baumina

kannst du mir bitte für diese Aussage ein Beispiel nennen

Zitat:
Dem stimme ich zu, nur ganz selten macht es Sinn Bedingungen in den Join statt in die Where-Clause zu nehmen
Ich sehe ehrlich gesagt gar keinen Unterschied, ob ich an der Stelle mit Where weiter mache, oder denn Join weiterführe. Aber du wirst mir sicherlich ein gutes Beispiel nennen können, beim dem der Unterschied deutlich wird, wann es Sinn macht und wann nicht.

mfg
Java ist auch eine Insel.
Ist Delphi von Oracle?
In meiner Buchstabensuppen fehlt das C++!
  Mit Zitat antworten Zitat
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#16

AW: Alphanumerische Werte eingrenzen (ähnlich Between)

  Alt 14. Sep 2015, 13:40
Beim INNER JOIN ist es egal, für RIGHT und LEFT JOIN gilt LEFT JOIN and RIGHT JOIN Optimization
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#17

AW: Alphanumerische Werte eingrenzen (ähnlich Between)

  Alt 14. Sep 2015, 14:56
Ich sehe ehrlich gesagt gar keinen Unterschied, ob ich an der Stelle mit Where weiter mache, oder denn Join weiterführe.
Hätte ich bis vor kurzem auch zugestimmt, bis ich einen
Code:
T1 LEFT JOIN T2 ON (T1.ID=T2.ID and T2.Wert=xxx and T2.wert1=yyyy)
hatte, der sich wie ein INNER JOIN verhielt. Ist zwar Oracle aber da sollte es eigentlich auch gehen.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#18

AW: Alphanumerische Werte eingrenzen (ähnlich Between)

  Alt 14. Sep 2015, 17:02
@baumina

kannst du mir bitte für diese Aussage ein Beispiel nennen

Zitat:
Dem stimme ich zu, nur ganz selten macht es Sinn Bedingungen in den Join statt in die Where-Clause zu nehmen
Ich bin zwar nicht baumina, aber muss dazu auch meinen Senf loswerden.

Ich bin es von "oracle" sql gewohnt, ohne ANSI Join Syntax zu arbeiten, gefällt mir auch viel besser, ist aber tatsächlich wohl nur Gewohnheit.
Im "Oracle" Style schreibt man alles hinter das "where" und ist glücklich. Technisch kann man auch alles in die ANSI Join Notation reinquetschen, also sozusagen das Gegenteil des "Oracle" Style.
Mal abgesehen von den Vorschriften, die es gibt, die sowieso zur Trennung von join und Bedingung bzw. Filter anhalten.
Man nimmt sich einfach ohne Not die Übersicht(lichkeit) und nicht nur sich, auch den Kollegen.
Über die Join Notation formuliert man die Kriterien zur (korrekten) Mengenbildung, die Filter im Where dienen tatsächlich dann nur noch dazu, das Ergebnis auszusieben.
Das sieht vielleicht nach Erbsenzählerei aus, kann einem bei komplexen Abfragen aber durchaus mal den Kopf retten. Es trägt zum Verständnis der Abfrage bei und ist hilfreich bei der Fehlersuche und vielleicht sogar schon bei der Erstellung.

Etwas plastisch wird das vielleicht bei typischen Programmieraufgaben, wo eine Filtermaske implementiert werden muss. Was auch immer der User möchte, den zusammengesetzten Filterausdruck setzt ganz sorgenfrei in die Where Clause, genau da gehört er hin. Die Joinkriterien des Selectstatements bleiben unangetastet.
Gruß, Jo
  Mit Zitat antworten Zitat
idefix2

Registriert seit: 17. Mär 2010
Ort: Wien
1.027 Beiträge
 
RAD-Studio 2009 Pro
 
#19

AW: Alphanumerische Werte eingrenzen (ähnlich Between)

  Alt 14. Sep 2015, 17:51
Intuitiv hätte ich gemeint, dass so eine Abfrage effizienter abgearbeitet werden kann, wenn einige Bedingungen, die viele Datensätze ausscheiden, schon im join festgelegt werden, weil dann die Ergebnismenge des joins kleiner ist? Was ist daran falsch?
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#20

AW: Alphanumerische Werte eingrenzen (ähnlich Between)

  Alt 14. Sep 2015, 18:47
Intuitiv hätte ich gemeint, dass so eine Abfrage effizienter abgearbeitet werden kann, wenn einige Bedingungen, die viele Datensätze ausscheiden, schon im join festgelegt werden, weil dann die Ergebnismenge des joins kleiner ist? Was ist daran falsch?
Daran ist erst einmal gar nichts falsch.

Ob das aber wirklich effizienter abgearbeitet wird und wenn, bei welcher Datenmenge und welcher Datenstruktur, hängt sehr stark vom DBMS und dem Optimizer ab.

Man kann pauschal da gar nichts sagen, nur ein konkreter Test kann hier die letztendliche Erkenntnis bringen.

Manchmal gibt es auch recht konkrete Aussagen zu einem konkreten DBMS
https://www.percona.com/blog/2010/04...oin-and-where/

Oder sowas http://stackoverflow.com/questions/1...r-than-a-where

(Ich suche noch einen Link zu einer Seite, auf der unterschiedliche Performance-Tests mit einem MS-SQL Server gemacht wurden, und dort gab es teilweise unterschiedliche Laufzeitverhalten abhänging von der Satzanzahl. Der scheint sich im Moment aber gut zu verstecken)
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (14. Sep 2015 um 18:58 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:06 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