Pregunta

Tengo una tabla de direcciones con ZIP campo de código que tiene el tipo VARCHAR. Necesito seleccionar todas las direcciones forman esta tabla Utilizando el rango de códigos postales. Si usara siguiente código:

select * from address where cast(zip as bigint) between 90210 and 90220

Me sale un error en los campos donde postal código cann't ser elegida como bigint.

¿Cómo puedo resolver este problema?

¿Fue útil?

Solución

Derivar una versión de la columna de la postal que es un bigint si el valor postal es numérico, y nula de otro modo, y luego prueba que.

Así que algo como

select * from address
where case when zip ~ '^[0-9]+$' then cast(zip as bigint) end between 90210 and 90220

Para hacer esta consulta eficiente, se puede crear un índice en esta expresión:

create index address_zip_idx on address(cast(zip as bigint)) where zip ~ '^[0-9]+$';
-- this query can now use that index
select * from address
where zip ~ '^[0-9]+$' and cast(zip as bigint) between 90210 and 90220;

Otros consejos

El error es obvia: usted tiene algunas direcciones postal no representa un número. Por ejemplo, letras o guiones. Si desea intepret como números, entonces debe deshacerse de los que no se compone de dígitos ... si que realmente se adapte a usted. Véase la respuesta de araqnid para algunas recetas. Pero en primer lugar preguntarse, si tiene algunos números ZIP almacenar como "123-34" ¿cómo quieres que intepret ellos, tal vez lo que necesita replantear el formato y el tipo de datos.

Si sólo nos han códigos postales continuación, probablemente debería tener dos columnas int como zip y plus_4. Sin embargo, la simple respuesta a su pregunta es simplemente hacer una comparación varchar. Es probable que ya tiene la columna de la postal indexada por lo que este sería todavía funcionan bastante bien.

SELECT * FROM address WHERE zip BETWEEN '90210' AND '90220'
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top