Ganymed Geschrieben 24. August 2005 Geschrieben 24. August 2005 Hallo zusammen, ich habe folgendes Problem. Vorgeschichte, warum die alte Lösung nicht mehr genommen werden kann: Ich habe diverse Artikel, die angekreuzt werden, ob Sie benutzt werden oder nicht. Dieses Ankreuzen wird in Oracle mit einer "0" bzw. einer "1" in einem Number-Feld gesichert. Aus diesen Angekreuzten Artikeln ergeben sich bestimmte Ausgabe-Kombinationen in einem Layoutprogramm. Dazu habe ich zuvor die Nullen und Einsen (also eine Binärzahl) zusammengefasst und mit BIN_TO_NUM in eine Number umgerechnet. Diese Number wird - wie der Name sagt - ebenfalls in einem Numberfeld gesichert. Mit Hilfe der gleichen Dezimalzahlen sehe ich dann, welche Kombinationen zusammengefasst werden können (gleiche Dezimalzahl = gleiche Ausgabe). Das hat auch wunderbar funktioniert. Nur leider haben wir jetzt einen Kanidaten der mehr als 126 Artikel benutzt und damit das in Oracle verfügbare Number-Feld ausreizt. Da ich keinen Datentypen gefunden habe, der größer ist, haben meine Kollegen und ich beschlossen ein Varchar zu nehmen und die Null-Eins-Kombinationen als String zu vergleichen. Also "011101" wird z.B. mit "110100" verglichen. Das funktioniert auch so weit ganz gut. Nun hänge ich an was anderem. Die kleinstmögliche Kombination (also ein Layoutdokument, in dem alle Artikel auf alle Fälle vorkommen), wird mit Hilfe der errechneten Dezimalzahlen und einem Bubblesort errechnet. Da ich ja jetzt keine Zahlen mehr habe (benutzen kann), habe ich folgende Frage: Gibt es ein Pendant zu einem Bubbelsort mit einem solchen Stringvergleich? Oder gibt es eine andere Möglichkeit mit Hilfe der Nullen und Einsen eine eindeutige Zahl zu ermitteln? Ich hab schon an Quersummen gedacht, aber das funktioniert nicht eindeutig... Klotzkopp, ich zähl auf dich (und auf alle anderen kreativen Köpfe hier natürlich auch ) Zitieren
perdian Geschrieben 24. August 2005 Geschrieben 24. August 2005 Interessante Art und Weise sowas zu speichern, hab ich auch noch nicht gesehen Hast du mal dran gedacht das ganze neu anzufassen und von Grund auf die Struktur her neu anzupassen und in eine normalisierte Struktur zu bringen? Zitieren
Ganymed Geschrieben 24. August 2005 Autor Geschrieben 24. August 2005 Nein, dazu haben wir keine Entwicklungszeit. Ich hätts ja gern einfach in ein größeres Zahlenfeld gepackt, aber das kennt Oracle nicht. Oder halt mit Java auslagern. Dazu fehlt mir aber das Technische KnowHow. Hab zwar mal was nachgeschaut,aber ich hab dazu einfach zu viele Fragen, als das ich das damit machen könnte. Hier in dem Oracle Buch gibts auch keine Strings-Vergleichs Funktionen. Naja, das BIN_TO_NUM stand ja auch nicht da drin. Vielleicht was dazu wer Rat? Zitieren
Klotzkopp Geschrieben 24. August 2005 Geschrieben 24. August 2005 Ich habe das Problem noch nichts ganz verstanden. Du hast also eine Menge dieser Strings, und willst diese Menge auf möglichst wenige reduzieren, so dass trotzdem eine Oder-Verknüpfung aller Elemente dasselbe Ergebnis liefert? Und du hast einen Algorithmus, der das für Zahlen tut? Warum kannst du den nicht auf die Strings anwenden? Zitieren
Ganymed Geschrieben 24. August 2005 Autor Geschrieben 24. August 2005 Also ich habe (nachdem ich mir die Nullen und Einsen so wie ich sie brauche zusammenklamüsert habe), insgesamt maximal 10 Strings, die den Aufbau einer Binärzahl haben. Ich kann sie ja wie oben beschrieben nicht umrechnen, weil der Datentyp die Zahlen nicht mehr aufnehmen kann. Nun müsste ich aber trotzdem irgendwie eindeutig herausbekommen, welcher dieser Binärzahlen nach dem Umrechnen die kleinste von allen wäre, ohne diese BIN_TO_NUM Funktion (die ist eingebaut). Nur hab ich nicht wirklich eine Idee wie das eindeutig funktionieren könnte ohen umrechnen. Ich hab schon an Trennen gedacht und die einzelnen Blöcke umrechnen; aber ich hab nen Fall gehabt, wo es nicht eindeutig war. (Schreibtischtest) Ich hab auch keine String-Funktion in meinen Büchern gefunden, die das kann: nämlich umrechnen und das Ergebnis in einem String sichern. Quasi ein BIN_TO_VARCHAR. Oder besser ein BIN_TO_CLOB. Aber dann hab ich ein anderes Problem, was ich schon im Datenbankforum gepostet habe... Irgendwie hängts an Oracle, dass meine Ideen nicht funktionieren :floet: Zitieren
Guybrush Threepwood Geschrieben 24. August 2005 Geschrieben 24. August 2005 Ich hab schon an Trennen gedacht und die einzelnen Blöcke umrechnen; aber ich hab nen Fall gehabt, wo es nicht eindeutig war. (Schreibtischtest) Also ich hab das Problem nicht wirklich verstanden, aber das müsste schon so funktionieren. Du teilst den String z.B. in zwei Hälften und wandelst beide in Dezimalzahlen um. Wie hast du denn nun verglichen das es nicht eindeutig war? Ich würde sagen wenn du nun die einzelnen Blöcke vergleichst dann sollte es gehen. Bsp: 01011100 => 0101 1100 => 5 12 01100101 => 0110 1011 => 6 11 wenn du nun zuerst die 5 mit der 6 und dann die 12 mit der 11 vergleichst sollte es eindeutig sein, oder nicht? Zitieren
Ganymed Geschrieben 24. August 2005 Autor Geschrieben 24. August 2005 Ja, ok, das hatte ich nicht gemacht. Ich hatte dann einfach die Zahlen addiert die da rauskamen und die Gesamtsumme verglichen... *jetzt grad überlegt wie sie das in den Bubblesort am dümmsten packt* Nur hab ich ein Problem, wann ich am besten Trennen sollte Die Anzahl der eingesetzten Artikel ist ja unterschiedlich. Von nur einem bis zu 500 ist alles dabei... Zitieren
Klotzkopp Geschrieben 24. August 2005 Geschrieben 24. August 2005 Nun müsste ich aber trotzdem irgendwie eindeutig herausbekommen, welcher dieser Binärzahlen nach dem Umrechnen die kleinste von allen wäre, ohne diese BIN_TO_NUM Funktion (die ist eingebaut).Hast du mal versucht, einfach die Strings selbst in einer "kleiner-als"-Relation zu vergleichen? Wenn da ein lexikalischer Vergleich gemacht wird, sollte das doch genau das sein, was du brauchst. Viele Programmiersprachen können das. Zitieren
Ganymed Geschrieben 24. August 2005 Autor Geschrieben 24. August 2005 @klotzkopp Also einfach den Bubblesort so belassen (der fragt ja nach "kleiner als"-Geschichten)? Also zwei Variablen, die Strings aufnehmen und dann fragen if var1 < var2 then ... end if; ? Hmmm... ist ein Versuch Wert. Da Oracle immer nur Fehler schmeisst hab ich mich da nicht rangetraut. Ich versuchs mal Zitieren
Muadibb Geschrieben 1. September 2005 Geschrieben 1. September 2005 Wäre es nicht eventuell einfacher (vielleicht nicht ganz so sauber) ein neues Number-Feld aufzunehmen und alles was über den 126. Artikel hinausgeht dort abzulegen? Du könntest dann bei bis zu 126 Artikeln das alte Verfahren belassen und wenn das 2. Number-Feld nicht leer ist in einem Zwischenschritt die beiden Felder verknüpfen und diese binäre Zahl wieder mit der alten Funktion umwandeln, oder habe ich da einen Denkfehler? Das Problem bleibt natürlich bestehen, falls es wieder einen Kandidaten gibt, der über diese Grenze hinauswächst ;-) VarChar kommt aber auch irgendwann an eine Grenze, oder nicht? (Bin leider nicht der Oracle-Experte) Ihr solltet eventuell mal abschätzen, wann Ihr die Grenzen der Felder wieder erreichen könntet, also bei VarChar bzw. 2. Number-Feld, falls dier beschriebene Weg eine Alternative wäre. Zitieren
Casvil Geschrieben 26. September 2005 Geschrieben 26. September 2005 Hallo, vieleicht ist das Probem schon gelöst?! Aber du hast doch einen normalen Varchar der nur aus "0" oder "1" besteht?! Das macht dann z.B. 0110100101. Bau dir doch einfach eine kleine Funktion der du diesen Varchar übergibst und die dir dann einen Zahlenwert liefert... Bsp: 110100101 -> 1x2^8+1x2^7+0x2^6+1x2^5+0x2^4+0x2^3+1x2^2+0x2^1+1x2^0 ->256+128+0+32+0+0+4+0+1 -> 421 Das ist eindeutig. Diese Zahl kann nur bei der Kombination 110100101 auftauchen. Das ist doch dann nur ganz normale Binär->Dezimal Umrechnung. Vorraussetzung ist allerdings, dass du immer wieder von dem selben Feld aus anfängst. Diese Zahlen die du dann bekommst kannst du ganz normal in den Bubblesort reinpacken. Cas Zitieren
Guybrush Threepwood Geschrieben 26. September 2005 Geschrieben 26. September 2005 @Casvil Das war aber doch das Problem das bei dieser Umrechnung die Zahl zu groß wurde Zitieren
Ganymed Geschrieben 26. September 2005 Autor Geschrieben 26. September 2005 Richtig Guybrush Aber ich hab das jetzt alles in einen großen String gepackt, damit kann ich 4000 Artikel aufnehmen. Das sollte reichen. Den Sort brauchen wir zum Glück nicht mehr da dich Anforderung daran aufgelöst wurde Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.