【问题标题】:Find Zipcode in range of Zipcodes在邮政编码范围内查找邮政编码
【发布时间】:2013-09-11 08:42:38
【问题描述】:

考虑以下几点:

CountryCode ZipCodeFrom ZipCodeTo Truck
-------------------------------------------
    UK      AA1234      AG4321    Truck 1
    UK      AG4322      AL9999    Truck 2
    UK      AM0000      AZ9999    Truck 3
    UK      BA0000      ZZ9999    Truck 4
    SE      0000        3333      Truck 10
    SE      3334        9000      Truck 11
    SE      9001        9999      Truck 12

每条线代表一辆送货卡车负责的区域。

假设将一份订单运送到邮政编码 AB4000,则应使用卡车 1。邮政编码 5000 将是卡车 11

有些国家的邮政编码混合使用字母和数字,有些国家只使用数字。

在给定邮政编码的情况下,有没有一种简单的方法可以找到对应的送货卡车(邮政编码范围)。

我尝试过使用 between,但它似乎对我不起作用。也许我需要为每个国家/地区的邮政编码创建一些规则?

可以用SQL或C#解决

更新:

select * from PostalCode where CountryCode = 'DK' and 'AB4000' between ZipCodeFrom and ZipCodeTo

select * from PostalCode where CountryCode = 'DK' and 'AB4000' <= ZipCodeTo and 'AB4000' >= ZipCodeFrom

这是我尝试过的

我会尝试 Wietze314 提出的建议。

【问题讨论】:

  • 失败的代码示例会有所帮助。
  • 检查我的更新。我提到 C# 的原因是因为我使用 EntityFramework 来获取我的数据,并且我认为可能有使用它的解决方案

标签: c# sql entity-framework-4 zipcode


【解决方案1】:

我认为为了做一个 BETWEEN,你可以将字母转换为数字(01 到 26) 所以

UK AA1234 AG4321 Truck 1

变成

UK 01011234 01074321 Truck 1

当心零!他们需要在那里。

【讨论】:

  • 嘿,我最终创建了一些执行您所说的代码。我保留了原始邮政编码值和数据库中唯一的数字邮政编码。
【解决方案2】:

通常我会在 sql-server 中创建一个函数。因为您不想检索所有行并在本地进行比较。它应该做一些类似的事情,但首先剥离字母。该函数防止实现代码超过两次。

【讨论】:

    【解决方案3】:

    这取决于您的区域在实际地理接近度方面需要有多好。

    查看其他用户的问题 - Zipcode based search

    另外,作为另一个例子,这里是英国邮政编码区域的地图 http://www.freemaptools.com/uk-postcode-map.htm

    我的观点基本上是,在两个连续数字之间进行选择只能在一定程度上发挥作用,例如县等主要地理标识符,并且规则可能会因国家/地区而异。

    【讨论】:

    • 距离和位置不重要,重要的是邮政编码。然后由用户来定义邮政编码范围,以便满足他们的需求。
    【解决方案4】:

    我用下面的表格和数据创建了一个测试:

    CREATE TABLE [PostalCodes](
        [CountryCode] [nvarchar](50) NULL,
        [ZipCodeFrom] [nvarchar](50) NULL,
        [ZipCodeTo] [nvarchar](50) NULL,
        [TruckId] [nvarchar](50) NULL
    ) 
    
    insert into [PostalCodes]
    values('UK','AA1234','AG4321','Truck 1');
    
    insert into [PostalCodes]
    values('UK','AG4322','AL9999','Truck 2');
    
    insert into [PostalCodes]
    values('UK','AM0000','AZ9999','Truck 3');
    
    insert into [PostalCodes]
    values('UK','BA0000','ZZ9999','Truck 4');
    
    insert into [PostalCodes]
    values('SE','0000','3333','Truck 10');
    
    insert into [PostalCodes]
    values('SE','3334','9000','Truck 11');
    
    insert into [PostalCodes]
    values('SE','9001','9999','Truck 12');
    

    运行这个选择我得到了预期的结果:

    select * 
      from [PostalCodes] 
     where CountryCode ='SE' 
       and '0200' between ZipCodeFrom and ZipCodeTo
    

    给卡车 10

    替换 '0200',用 '10000' 得到 Truck 10,因为根据字母表,'10000' 介于 '0000' 和 '3333' 之间。不过可能不是你所期望的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-09
      • 1970-01-01
      • 2012-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-10
      相关资源
      最近更新 更多