Postgres varchar字段
问题描述:
我有一个邮政编码字段类型为VARCHAR的地址表。 我需要使用邮政编码范围选择此表格中的所有地址。 如果我用下面的代码:Postgres varchar字段
select * from address where cast(zip as bigint) between 90210 and 90220
我得到的地方的邮政编码水湿被转换为BIGINT的字段错误。
我该如何解决这个问题?
答
如果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;
答
的错误是显而易见的:你有一些zip地址不代表数。例如,字母或破折号。如果你想把它们解释为数字,那么你必须摆脱那些不是由数字组成的......如果那真的适合你。看到araqnid的一些食谱的答案。 但首先要问自己,如果你有一些ZIP数字存储为“123-34”,你想如何解释它们,或许你需要重新考虑格式和数据类型。
答
如果你只有美国邮政编码,那么你应该有两个int列,如zip和plus_4。但你的问题的简单答案是只做一个varchar比较。你可能已经有了索引的zip列,所以这仍然可以很好地工作。
SELECT * FROM address WHERE zip BETWEEN '90210' AND '90220'