2017-01-05 3 views
1

Ich habe eine kurze Textspalte in Access namens ZIP. Es muss ein kurzer Text sein.Wie kann ich die ersten 4 Zeichen einer Spalte in SQL nehmen und vergleichen?

Ich versuche die ersten 4 Zeichen jedes ZIP auszuwählen und zu sehen, ob es unter einer bestimmten Nummer ist.

MY SQL ist:

SELECT * 
FROM [WORK] 
WHERE LEFT(ZIP, 4) < 300; 

Ich erhalte eine Fehlermeldung, die besagt, "Datentypenkonflikt in Kriterium-Ausdruck." Ich gehe davon aus, dass das ZIP-Feld ein Kurztext und keine Nummer ist. Wie würde ich darüber gehen?

+0

versuchen, die Datentypen Gießen (ohne uns Ihre Datenstruktur thas die besten quess wissen) – happymacarts

+0

@happymacarts ZIP ist eine Zeichenfolge, da es sich um eine 10-stellige codierte Postleitzahl mit einem Bindestrich in der Mitte handelt. Ich brauche nur die ersten 3 von ZIP und das zu einem INT zu werfen. – rohanharrison

+0

Nimmt man nur US-Postleitzahlen an, dann spielt der Vergleich als numerisch gegen varchar keine Rolle; vorausgesetzt, jede Postleitzahl im System ist gut gebildet (Bedeutung 5 Ziffern oder 5 Ziffern + '-' + 4 Ziffern.) Die Logik der Bewertung einer Postleitzahl mit weniger als 300 ist interessant, aber ich denke, wenn Sie nach New England und dem Nahen Osten der USA Coast es funktioniert. (kein Florida Georgia Alabama usw.). "Mathe" für eine Integer-Postleitzahl zu machen, erscheint mir einfach falsch. Es wäre vielleicht besser, die Zip-Datei in die erste Ziffer 2 und die letzte 2 zu zerlegen .... Schließlich, warum 4 Positionen, wenn Sie nur mit 3 vergleichen? – xQbert

Antwort

1

ich es herausgefunden, ich brauchte nur einfache Anführungszeichen um den 300.

ich schließlich zu setzen:

SELECT * 
FROM [WORK] 
WHERE LEFT(ZIP, 4) < '300' or LEFT(ZIP, 4) > '399'; 
+0

Ich würde Sie davor warnen, Zahlen als Zeichenfolgen zu vergleichen. Ihr ZIP-Feld ist ein Textfeld, weshalb Sie beim Vergleich mit einer Zahl (die 300 ohne Anführungszeichen) einen Datentypkonflikt erhalten haben. Anstatt Ihre Zahl in eine Zeichenfolge mit Anführungszeichen zu ändern, sollten Sie Ihr ZIP-Feld als Zahl darstellen, damit Sie einen Zahlenvergleich durchführen können. – Newd

+0

Sie haben Recht. Das funktioniert, könnte aber möglicherweise schlecht sein. – rohanharrison

+0

Das ist anders als Ihre ursprüngliche Frage - die John richtig beantwortet (jetzt gelöscht). – Gustav

0

Dies funktioniert:

SELECT * 
FROM [WORK] 
WHERE LEFT(ZIP, 3) BETWEEN '300' AND '399'; 

Wenn jedoch Die Postleitzahl hat immer drei Ziffern vor dem Bindestrich, in diesem Fall müssten Sie nur nach der ersten Ziffer suchen:

SELECT * 
FROM [WORK] 
WHERE LEFT(ZIP, 1) = '3'; 

Sie können auch numerisch vergleichen:

SELECT * 
FROM [WORK] 
WHERE VAL(LEFT(ZIP, 3)) BETWEEN 300 AND 399; 

und wenn Sie Nullwerte:

SELECT * 
FROM [WORK] 
WHERE VAL(LEFT(Nz(ZIP), 3)) BETWEEN 300 AND 399; 
+0

Die dritte ist, was ich (numerisch) würde, aber ich bekomme den gleichen Datentyp Mismatch-Fehler. – rohanharrison

+0

Dann haben Sie Null-Werte für einige (fehlende) Postleitzahlen. Siehe bearbeitete Antwort. – Gustav

Verwandte Themen