2016-11-18 2 views
0

Die Aufgabe: Können Sie alle Roboter, die sich in NY befinden, zurückgeben?Warum ist dieser SQL-Code (SUBSTR) falsch?

enter image description here

mein Code:

SELECT * FROM robots 
WHERE SUBSTR(location, LEN(location)-2, 2) = 'NY'; 

Eine Arbeitscode:

SELECT * FROM robots 
WHERE SUBSTR(location, -2, 2) = 'NY'; 

Warum LEN funktioniert nicht gut in meinem Code?

Dank

+0

Bitte erläutern Sie "LEN funktioniert nicht gut". Erhalten Sie eine Fehlermeldung oder gibt es keine Ergebnisse? Welche SQL-Implementierung verwenden Sie? –

+2

Warum nicht für Where Location wie '% NY' ... keine Notwendigkeit für Rekord-Level-Berechnungen –

+0

@ John Cappelletti - Wenn jeder Ort haben "Ny" Es wird falsche Datensätze holen, Bitte beachten Sie den 5. Datensatz aus dem Bild "Nyack, NY " –

Antwort

1

Das Problem ist, dass according to the documentation:

Start

eine ganze Zahl oder bigint Ausdruck, der die zurückgegebenen Zeichen gibt an, wo beginnen. (Die Nummerierung basiert auf 1, was bedeutet, dass das erste Zeichen im Ausdruck 1 ist).

So wertet SUBSTR("NY, NY", LEN("NY, NY")-2, 2)-SUBSTR("NY, NY", 4, 2), das ist:

NY, NY 
123456 
    ^^ 

Ihre zurückgegebene String ist " N", so SUBSTR(location, LEN(location)-1, 2), Subtrahieren von 1 nur, sollten Sie das richtige Ergebnis.

0

Versuchen Sie dies. Kann sein, ein Leerzeichen Speicherort vor und nach dem Text. Schneiden Sie den Text also vor der Verwendung der Teilzeichenfolge ab.

--For MS SQL 
SELECT * FROM robots 
WHERE SUBSTRING(LTRIM(RTRIM(location)),LEN(LTRIM(RTRIM(location)))-1,LEN(LTRIM(RTRIM(location)))) = 'NY'; 

Für Oracle. wir müssen das Längenschlüsselwort nicht LEN verwenden. Danke :-)

0

Beachten Sie, dass der Aufruf von SUBSTR die Abfrage abbrechen wird, die die entsprechenden Indizes auswählt/verwendet.

SELECT * FROM robots 
WHERE SUBSTR(location, -2, 2) = 'NY'; 

In Bezug auf Leistung können Sie besser sein

LIKE '%, NY' 

in MS SQL.