我是Oracle新手,我正在使用oracle 11g。我正在存储英国的邮政编码。价值观就像这些。
N22 5HF SW1 4JD N14 8IT N22 1JT E1 5DP e1 8DS E3 8TU
我应该能够轻松比较每个邮政编码的前四个字符。
存储这些数据的最佳data type
是什么?
答案 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)
列,以保持字母数字值最大值和标准格式。
答案 2 :(得分:1)
在我看来你应该使用varchar2数据类型,因为这个字段不会在数学计算中(它们不应该是int或decimal)并且这些字段不够大(所以这不应该是文本)