2010-06-10 74 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'