2010-06-10 73 views
1

我有一个邮政编码字段类型为VARCHAR的地址表。 我需要使用邮政编码范围选择此表格中的所有地址。 如果我用下面的代码:Postgres varchar字段

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

我得到的地方的邮政编码水湿被转换为BIGINT的字段错误。

我该如何解决这个问题?

回答

0

如果zip值是数字,则推导出是bigint的zip列的版本,否则返回null,然后测试该列。

所以某物像

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

为了使这个查询效率,你可以在这个表达式创建索引:

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; 
0

的错误是显而易见的:你有一些zip地址不代表数。例如,字母或破折号。如果你想把它们解释为数字,那么你必须摆脱那些不是由数字组成的......如果那真的适合你。看到araqnid的一些食谱的答案。 但首先要问自己,如果你有一些ZIP数字存储为“123-34”,你想如何解释它们,或许你需要重新考虑格式和数据类型。

0

如果你只有美国邮政编码,那么你应该有两个int列,如zip和plus_4。但你的问题的简单答案是只做一个varchar比较。你可能已经有了索引的zip列,所以这仍然可以很好地工作。

SELECT * FROM address WHERE zip BETWEEN '90210' AND '90220'