我遇到以下情况:
我有一个表格,其中包含格式为:
的邮政编码列表1234 AA (Dutch postcode)
2345 ZF
B-2345 (Belgium postcode)
B-4355
我有另一个包含postcoderanges的表:
PostcodeFrom
1000 AF
2000 ZF
B-1234
PostcodeTo
1999 ZX
2999 ZF
B-1889
我正在寻找一种解决方案,如何在几个范围之间查找邮政编码值。 首先我想的是
SUBSTRING(MyPostcode,1,4) BETWEEN SUBSTRING(PostcodeFrom,1,4) AND SUBSTRING(PostcodeTo,1,4)
..但是人物的问题仍然存在(甚至不考虑比利时邮政编码)。
有人可以帮助我吗?
此致,
感谢您的回复!
您绘制的表需要多一个字段:RegionCode。
排列元素:
| RCode | PCodeFrom | PCodeTo |
| 001 | 1000 BA | 1999 ZZ |
| 002 | 1000 AA | 1999 AZ |
请注意,如果邮政编码是1234 AC,则必须返回RegionCode:002
要比较数字并不难,但如何比较字符?
我有一个用AA-ZZ制作桌子的想法,每个组合都有一定的INT值,但我希望还有另一种更简单的方法。
答案 0 :(得分:2)
您只能通过字符类型将邮政编码的各部分拆分为不同的列,从而可靠地执行此操作(忽略与邮政编码进行此类范围匹配的潜在 un - 可靠性)。
我对荷兰语邮政编码知之甚少,但如果您的格式正确,您可以创建一个表格,如:
+-------+------+
| code | city |
+-------+------+
| 1234 | AA |
+-------+------+
将邮政编码分开将允许您进行更细粒度的排序。
看了Wikipedia page on Dutch postcodes看起来这应该适用于所有人。我的code
和city
标签虽然不准确。
除此之外:我对荷兰有这样一个理智的邮政编码格式印象深刻,不像英国那样你需要一个巨大的正则表达式来决定格式是否有效。
您的检查也适用于字符,但您最好将邮政编码存储在具有ID的单独表格中。上面的例子只是为了显示从数字中分割字符,所以你真正想要的更像是:
mysql> select * from postcodes;
+------+-------+-------+
| id | part1 | part2 |
+------+-------+-------+
| 1 | 1234 | AA |
| 2 | 5678 | BB |
+------+-------+-------+
当你存储范围时,不要将邮政编码存储在ranges
表中,将条目的id存储在postcodes
表中,如:
mysql> select * from ranges;
+-------------+---------------+-------------+
| region_code | postcode_from | postcode_to |
+-------------+---------------+-------------+
| 1 | 1 | 2 |
+-------------+---------------+-------------+
该记录显示“区域1为1234 AA至5678 BB”
举个例子,我会说邮政编码从0001 AA开始,然后移到0001 AB,一直到0001 ZZ,然后是0002 AA等等。这显然是不对的,但它证明了这一理论。您需要将此替换为您用于定义邮政编码递增和递减方式的算法。
当您想要找出“邮政编码3456 XY适合区域89吗?”时,将其拆分为字符和数字,并检查这些值是否适合某个范围。使用我的算法,我检查:
数字部分是大于还是小于postcode_from
的数字部分?
如果它更大,那么它是否小于postcode_to
的数字部分?
如果你满足这两个条件,检查字母 - 这是重要的一点 - MySQL的字符集整理 允许你说“AB
小于BC
,你可以:
WHERE 'AB' < part2;
在WHERE
条款中。
使用此方法,您可以确定哪些区域的开头和结尾符合您正在测试的值。
它有点啰嗦,但它可以在不进行任何转换的情况下工作。您可能需要检查您使用的排序规则是否符合您使用的特定类型邮政编码的刻字顺序。