2011-05-12 15 views
14

Quiero hacer una búsqueda usando la cláusula "between" sobre una columna de cadena. Haciendo algunas pruebas obtuve esto:SQL Between cláusula with strings columns

Supongamos que hay una tabla de países con una columna de "nombre" de tipo varchar. Si ejecuta esta consulta:

Select * from country where name between 'a' and 'b' 

Tengo este resultado:

Argentina 
. 
. 
. 
Argelia. 

Excluye aquellos países que comienzan con B que me pareció un poco raro.

¿Hay alguna manera de hacer esta búsqueda de una manera más precisa? ¿Alguna otra idea para hacer esta búsqueda?

Gracias de antemano

Respuesta

29

La expresión

name between 'A' and 'B' 

es equivalente a

name>='A' and name<='B' 

Así ' Argentina 'es> =' A 'y < =' B 'y cumple la condición. Pero 'Bolivia' NO es < = 'B'. 'Bolivia'> 'B'. No solo mira la primera letra: mira toda la cadena. Que seguramente es la forma en que debería ser: si no hiciera esto, no habría forma de decir que quería un rango que incluyera 'Smith' pero no 'Smithers'.

Para lograr lo que desea, se podría decir:

substr(name,1,1) between 'A' and 'B' 

o:

name like 'A%' or name like 'B%' 

o:

name>='A' and name<'C' 
1

del resultado exacto, pero es posible que se malentendido. x between a and b significa x>=a and x<=b. (Véase la PostGRES documentation para más detalles.)

Si desea obtener líneas que comienzan ya sea con un a o una b, dicen lo que quiere decir:

select * from country where name like 'a%' or name like 'b%' 

like utiliza los índices de la tabla de manera que obtendrá pleno rendimiento para usar esto.

+0

¡Oh! bueno, tenías razón en la parte comprensible (y también en toda la respuesta). gracias – Cheluis

+2

En realidad, "x entre 'a' y 'b'" es equivalente a "x> = 'a' yx <= 'b'" – Jay

+0

No es así ... 'seleccione 1 entre 0 y 1; // true ' –

1

Otra consulta que conseguir que los países que comienzan con b, así como A, sería:

Select * from country where name between 'a' and 'c' 
+0

Aunque si tuviera un país llamado 'c', pasaría esa prueba. Tal vez no sea relevante en este ejemplo, estoy bastante seguro de que no hay un país en el mundo llamado simplemente "C", pero podría aparecer en otros ejemplos. – Jay

0
Select * from country where substring(name FROM 1 FOR 1) between 'A' and 'B'; 
2

Creo que sé cómo resolver su problema. u puede intentar añadir personaje extra en la parte de atrás como esto

select * from tablea where column1 between 'ABC' and 'ACD'+'Z' 

este devolverá un resultado de ABC% a ACE

-1

La razón de esta declaración no funcionó es almohadillas SQL la cadena con espacios en blanco hasta que sea la la misma longitud que la secuencia de comparación.Entonces, en comparación, sql comparó b seguido de varios espacios en blanco con b******. Debido a que el espacio en blanco aparece antes que todas las demás letras, sql decidió b***** después de b[6 spaces]. Por lo tanto, no debería mostrarse.

+0

En este caso, la diferencia en el espacio en blanco no es el problema. – titanofold

Cuestiones relacionadas