与Postgres的varchar字段

我有一个邮政编码字段,类型为VARCHAR的地址表。 我需要选择所有地址使用邮政编码区间形式此表。 如果我用下面的代码:

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

我上哪里的邮政编码水湿被转换为BIGINT的字段错误。

我怎样才能解决这个问题?

--------------解决方案-------------

派生一个版本的zip列,它是一个BIGINT如果压缩值是数字,而空,否则,再测试。

所以,某事像

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;

该错误是显而易见的:你有一些拉链地址不表示数量。 例如,字母或破折号。 如果你想intepret这些数字,则必须摆脱那些不是由数字......如果真正适合你的。 见araqnid的回答一些食谱。 但是,先问问自己,如果你有一些ZIP号店为“123-34”你怎么想intepret他们,也许你需要重新思考的格式和数据类型。

如果你只有美国的邮政编码,那么你也许应该有像拉链plus_4两个int的列。 但简单的回答你的问题是,只是做一个VARCHAR比较。 你可能已经收录所以这仍然会工作得很好的压缩列。

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

分类:PostgreSQL的 时间:2015-03-15 人气:0
本文关键词: PostgreSQL的,sqldatatypes
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.219 (s). 10 q(s)