1

我有一个带有 VARCHAR 类型的邮政编码字段的地址表。我需要使用邮政编码范围从该表中选择所有地址。如果我使用下一个代码:

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

我在无法将邮政编码转换为 bigint 的字段上收到错误消息。

我该如何解决这个问题?

4

3 回答 3

0

如果 zip 值为数字,则导出 zip 列的版本,该版本为 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;
于 2010-06-10T15:48:41.687 回答
-1

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

于 2010-06-10T15:51:05.517 回答
-1

如果您只有美国邮政编码,那么您可能应该有两个 int 列,例如 zip 和 plus_4。但是对您的问题的简单回答是只进行 varchar 比较。您可能已经对 zip 列进行了索引,因此这仍然可以很好地工作。

SELECT * FROM address WHERE zip BETWEEN '90210' AND '90220'
于 2010-06-10T16:43:07.470 回答