我有一个带有邮政编码字段的地址表,其类型为VARCHAR。 我需要使用邮政编码范围从该表中选择所有地址。 如果我使用下一个代码:
select * from address where cast(zip as bigint) between 90210 and 90220
我在邮政编码无法转换为bigint的字段上收到错误。
我如何解决这个问题?
答案 0 :(得分:0)
如果zip值是数字,则导出zipint列的一个bigint版本,否则返回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;
答案 1 :(得分:-1)
错误很明显:你有一些zip地址不代表数字。例如,字母或短划线。如果你想把它们作为数字解释,你必须摆脱那些不是由数字组成的......如果那真的适合你。有关食谱,请参阅araqnid的答案。 但首先问问自己,如果你有一些ZIP编号存储为“123-34”你想如何解释它们,也许你需要重新考虑格式和数据类型。
答案 2 :(得分:-1)
如果你只有美国邮政编码,那么你应该有两个int列,比如zip和plus_4。但是你问题的简单答案就是做一个varchar比较。您可能已将索引列编入索引,因此这仍然可以正常工作。
SELECT * FROM address WHERE zip BETWEEN '90210' AND '90220'