我是Oracle的新手,我使用的是oracle 11g。我正在儲存英國的郵政編碼。價值是這樣的。在oracle中存儲郵政編碼的最佳數據類型
N22 5HF SW1 4JD N14 8IT N22 1JT E1 5DP e1 8DS E3 8TU
我應該能夠輕鬆地比較的每個郵政編碼前四個字符。 什麼是最好的data type
來存儲這些數據?
我是Oracle的新手,我使用的是oracle 11g。我正在儲存英國的郵政編碼。價值是這樣的。在oracle中存儲郵政編碼的最佳數據類型
N22 5HF SW1 4JD N14 8IT N22 1JT E1 5DP e1 8DS E3 8TU
我應該能夠輕鬆地比較的每個郵政編碼前四個字符。 什麼是最好的data type
來存儲這些數據?
作爲Lalit答案的一個細微變化,因爲您想要outward code而不是前四個字符的固定子字符串(這可能會產生空間和內部代碼的開始),您可以創建一個虛擬列,值的第一個字:
postcode varchar2(8),
outward_code generated always as
(substr(postcode, 1, instr(postcode, ' ', 1, 1) - 1))
並且可能的話,但可能如果您使用它來搜索虛擬列上的索引。
這裏假定郵政編碼格式正確。如果你不總是在向外和向內的代碼之間有空格,它將不起作用。要回答您的原始問題,實際的郵政編碼應該是varchar2(8)
列,以便將字母數字值最大爲最大值並使用標準格式。
_「這假定郵政編碼格式正確的第一位。」_這應該可以通過['CHECK'約束](http:// docs.oracle.com/cd/B19306_01/server.102/b14200/clauses002.htm#sthref2913)。 –
虛擬列上的索引等同於基於函數的索引。 –
在我看來,你應該使用varchar2數據類型,因爲這個字段不會在數學計算(他們不應該是int或小數),並且這些字段不夠大(所以這不應該是文本)
我應該可以輕鬆比較每個郵政編碼的前四個字符。
然後保留這些前四個字符在一個單獨的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
表格,否則問題會在以後開始爬行。
你真的是指前四個字符,還是[外碼](http://en.m.wikipedia.org/wiki/UK_postcodes#Outward_code)?這些值的格式是否正確? –
@AlexPoole現在我讀了關於向外代碼,是的,它是向外代碼 – chathwind