Because your field is a string type and G2 comes after G1X. Your solution depends on the data you have in this field, are there other characters than G?
You'd need to parse the field and the strings. If we assume that all strings always begin with a G and otherwise have only numeric characters, where substr(location,2,length(location)) between substr('G1',2,length('G1')) and substr('G4',2,length('G4')) would work. You'd probably need a function-based index to make that perform reasonably.
Thanks for you suggestion but there are other locations also in which there is no numeric value and have only characters whose length is also not fixed (some are 5 char long.some are 6 char long).
G?where substr(location,2,length(location)) between substr('G1',2,length('G1')) and substr('G4',2,length('G4'))would work. You'd probably need a function-based index to make that perform reasonably.