Frage

Ich bin einige CHAR Daten in einer where-Klausel in meinem SQL wie folgt zu vergleichen,

Dabei gilt PRI_CODE

Das Problem, das ich habe, ist, wenn die CHAR Werte unterschiedlicher Länge sind. Also, wenn PRI_CODE = '0800' und PriCode = '20' es zurückkehrt wahr statt falsch.

Es sieht aus wie es es wie folgt

vergleicht
'08' < '20' 

statt wie

'0800' < '20'

Ist ein CHAR Vergleich Start von links, bis der eine oder andere Werte enden?

Wenn ja, wie kann ich dieses Problem beheben?

Meine Werte können Buchstaben in ihm so convering zu numerisch ist keine Option.

War es hilfreich?

Lösung

Es ist zu vergleichen nicht '08' mit '20', ist es, wie Sie es erwarten, zu vergleichen '0800' mit '20'.

Was Sie nicht zu erwarten scheinen, ist jedoch, dass '0800' (die Zeichenkette) ist in der Tat weniger als '20' (die Zeichenkette).

Wenn es um Numerik für einen numerischen Vergleich Umwandlung der Frage aus, könnten Sie die folgende DB2-Funktion verwenden:

right ('0000000000'||val,10)

, die Sie auf der linken Seite gepolsterte geben val mit Nullen bis zu einer Größe von 10 (ideal für einen CHAR(10), zum Beispiel). Das wird zumindest gewährleistet, dass die Felder die gleiche Größe und der Vergleich sind für Ihren speziellen Fall arbeiten. Aber ich fordere Sie zu überdenken, wie Sie Dinge tun:. Pro-Reihe Funktionen selten gut skalieren, Performance-weise

Wenn Sie mit z / OS, sollten Sie ein paar DBAs haben nur auf dem Computerraum Boden für die Arbeit wartet herumliegen - Sie wahrscheinlich einer von ihnen um Rat mehr auf Ihre spezifische Anwendung zugeschnitten fragen kann: -)

Eine Sache, die den Sinn in der Verwendung eines insert / update-Trigger und sekundäre Spalte PRI_CODE_PADDED kommt die PRI_CODE Säule vollständig aufgefüllt (mit der gleichen Methode wie oben) zu halten. Dann stellen Sie sicher, dass Ihre PriCode Variable wird in ähnlicher Weise formatiert werden, bevor die select ... where PR_CODE_PADDED < PriCode ausgeführt wird.

eingeht, deren Kosten bei insert / update Zeit wird es alle wählt Sie wahrscheinlich zu tun sind amortisieren über (die, weil sie nicht mehr mit pro-Reihe Funktionen wird blendend schnell sein), so dass Sie eine bessere Gesamtleistung (Ihre Datenbank unter der Annahme ist nicht einer dieser unglaublich seltenen Tiere, die als Lese mehr geschrieben werden, natürlich).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top