6 Stimmen

Kann ich mit TSQL eine CHAR(1)-Spalte um eins erhöhen und sie in einem LEFT OUTER JOIN ohne CASE-Anweisung verwenden?

Diese Frage ist ähnlich wie meine letzte Frage . Nur dass ich diesmal Buchstaben statt 6-stelliger Ganzzahlen verwende. Ich möchte die nicht aufeinanderfolgenden "Buchstaben" finden.

Nehmen wir an, ich habe die folgenden Daten:

id | Date | Letter
-----------------------------
01 | 5/1/2009 | X
02 | 5/1/2009 | Y
03 | 5/1/2009 | Z
04 | 5/1/2009 | A
05 | 5/1/2009 | B
06 | 5/1/2009 | D

Ich würde gerne eine Abfrage erstellen, die mir sagt, dass zwischen Zeile 05 und 06 eine Zeile mit "C" stehen sollte.

In meiner letzten Frage (unter Verwendung von INTs) wurde mir etwas Ähnliches wie die folgende Lösung angeboten, und sie hat hervorragend funktioniert.

SELECT * from TABLE1 t1 
LEFT OUTER JOIN TABLE2 t2 ON t2.INTCol - 1 = t2.INTCol AND t1.date = t2.date
WHERE t2.id IS NULL

Nun, bei Buchstaben kann ich (soweit ich weiß) nicht (G - 1) sagen. Gibt es einen anderen Weg, wie ich das machen kann?

Die von mir verwendete Datenbank ist SQL Server 2005. Ich glaube, es gibt eine einfache Lösung in PL/SQL, die TRANSLATE verwendet, aber ich glaube nicht, dass ich etwas Ähnliches mit TSQL machen kann.

11voto

cjk Punkte 44394

Sie können char(1) in seine ascii-Nummer umwandeln, indem Sie

ASCII(Letter)

Sie können dann diesen Wert um eins erhöhen und ihn mit CHAR (falls erforderlich) in einen Buchstaben umwandeln, so dass Ihr Code folgendermaßen aussehen würde:

SELECT * from TABLE1 t1 
LEFT OUTER JOIN TABLE2 t2 
      ON ASCII(t1.INTCol) - 1 = ASCII(t2.INTCol) 
      AND t1.date = t2.date
WHERE t2.id IS NULL

4voto

Philippe Leybaert Punkte 161931

Sie können die Funktion ASCII() verwenden, um ein Zeichen in seinen ASCII-Wert umzuwandeln:

ASCII(Buchstabe)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X