2015-01-10 58 views
0

我是Oracle的新手,我使用的是oracle 11g。我正在儲存英國的郵政編碼。價值是這樣的。在oracle中存儲郵政編碼的最佳數據類型

 
N22 5HF 

SW1 4JD 

N14 8IT 

N22 1JT 

E1 5DP 

e1 8DS 

E3 8TU 

我應該能夠輕鬆地比較的每個郵政編碼前四個字符。 什麼是最好的data type來存儲這些數據?

+0

你真的是指前四個字符,還是[外碼](http://en.m.wikipedia.org/wiki/UK_postcodes#Outward_code)?這些值的格式是否正確? –

+0

@AlexPoole現在我讀了關於向外代碼,是的,它是向外代碼 – chathwind

回答

2

作爲Lalit答案的一個細微變化,因爲您想要outward code而不是前四個字符的固定子字符串(這可能會產生空間和內部代碼的開始),您可以創建一個虛擬列,值的第一個字:

postcode varchar2(8), 
outward_code generated always as 
    (substr(postcode, 1, instr(postcode, ' ', 1, 1) - 1)) 

並且可能的話,但可能如果您使用它來搜索虛擬列上的索引。

這裏假定郵政編碼格式正確。如果你不總是在向外和向內的代碼之間有空格,它將不起作用。要回答您的原始問題,實際的郵政編碼應該是varchar2(8)列,以便將字母數字值最大爲最大值並使用標準格式。

SQL Fiddle demo

+2

_「這假定郵政編碼格式正確的第一位。」_這應該可以通過['CHECK'約束](http:// docs.oracle.com/cd/B19306_01/server.102/b14200/clauses002.htm#sthref2913)。 –

+0

虛擬列上的索引等同於基於函數的索引。 –

1

在我看來,你應該使用varchar2數據類型,因爲這個字段不會在數學計算(他們不應該是int或小數),並且這些字段不夠大(所以這不應該是文本)

2

我應該可以輕鬆比較每個郵政編碼的前四個字符。

然後保留這些前四個字符在一個單獨的column。和index這一欄。您可以將其他字符保留在不同的列中。現在,如果代碼是alphanumeric characters的混合,那麼您剩下的數據類型爲VARCHAR2

你的查詢謂詞想 -

WHERE post_code_col = substr('N22 5HF', 1, 4)

因此indexed column post_code_col將是有效的在performance

11g上,您可以選擇創建virtual column。但是,索引它將相當於function-based索引。所以我希望按照我上面的建議來選擇第一種方式。

在設計階段最好是normalize表格,否則問題會在以後開始爬行。