在oracle中存储邮政编码的最佳数据类型

时间:2015-01-10 06:00:55

标签: oracle oracle11g sqldatatypes

我是Oracle新手,我正在使用oracle 11g。我正在存储英国的邮政编码。价值观就像这些。

 N22 5HF

 SW1 4JD

 N14 8IT

 N22 1JT

 E1 5DP

 e1 8DS

 E3 8TU

我应该能够轻松比较每个邮政编码的前四个字符。 存储这些数据的最佳data type是什么?

3 个答案:

答案 0 :(得分: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表,否则问题会在以后开始蔓延。

答案 1 :(得分: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 :(得分:1)

在我看来你应该使用varchar2数据类型,因为这个字段不会在数学计算中(它们不应该是int或decimal)并且这些字段不够大(所以这不应该是文本)