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

Best datatype to store postal codes in oracle

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

 N22 5HF

 SW1 4JD

 N14 8IT

 N22 1JT

 E1 5DP

 e1 8DS

 E3 8TU

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

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

I should be able to easily compare first four characters of each postal code.

然后将这前四个字符保存在单独的 column 中。还有 index 这一栏。您可以将其他字符保留在不同的列中。现在,如果代码是 alphanumeric characters 的混合,那么您将剩下 VARCHAR2 数据类型。

您的查询谓词需要 -

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

因此 indexed column post_code_colperformance 中是有效的。

11g,您可以选择创建一个 virtual column。但是,索引它相当于 function-based 索引。所以我更喜欢我上面建议的第一种方式。

最好在设计阶段 normalize table ,否则问题会在稍后开始出现。

作为 Lalit 答案的细微变化,因为您需要 outward code 而不是前四个字符的固定子字符串(可能包含 space 和内部代码的开头) ,可以根据值的第一个字创建一个虚拟列:

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

并且可选,但如果您使用它进行搜索,则可能是虚拟列上的索引。

这假设 post 代码首先被正确格式化。如果您不总是在外向代码和内向代码之间使用 space,它将无法工作。为了回答您原来的问题,实际的 post 代码应该是一个 varchar2(8) 列,用于将字母数字值保存到最大大小并采用标准格式。

SQL Fiddle demo.