SQL查询返回无效的邮政编码

时间:2014-03-20 14:16:03

标签: sql sql-server tsql

我编写了一个在我们的数据库中返回无效邮政编码的查询,见下文。它运行良好,但输出仍然返回前两行的值 - 特殊情况。

第一个GIR 0AA是一个存在的实际邮政编码,但不符合传统格式,因此应完全排除。第二个是英国军队的邮政编码,以BFPO开头,后跟一个空格,然后是1到500之间的数字。这些邮编也需要从符合指定标准的输出中排除。

我怀疑我的格式不太合适,所以你们中的任何人都可以帮助我吗?

提前致谢。

-- Returns invalid postcodes

SELECT house_name, address, town, county, postcode

FROM Addresses

WHERE

-- Special case GIR 0AA

patindex('[GIR] [0AA]', postcode) = 0 and -- Need to exclude these from results

-- Special case Static British Forces Post Offices (BFPO)

patindex('[BFPO] [1-500]', postcode) = 0 and --Need to exclude these from results

-- AANN NAA

patindex('[A-Z][A-Z][0-9][0-9] [0-9][A-Z][A-Z]', postcode) = 0 and

-- AANA NAA

patindex('[A-Z][A-Z][0-9][A-Z] [0-9][A-Z][A-Z]', postcode) = 0 and

-- ANN NAA

patindex('[A-Z][0-9][0-9] [0-9][A-Z][A-Z]', postcode) = 0 and

-- AAN NAA

patindex('[A-Z][A-Z][0-9] [0-9][A-Z][A-Z]', postcode) = 0 and

-- ANA NAA

patindex('[A-Z][0-9][A-Z] [0-9][A-Z][A-Z]', postcode) = 0 and

-- AN NAA

patindex('[A-Z][0-9] [0-9][A-Z][A-Z]', postcode) = 0


ORDER BY postcode ASC

3 个答案:

答案 0 :(得分:3)

首先,当patindex()更有意义时,您正在使用likeLike是标准SQL以及在此上下文中“期望”的内容。

其次,您滥用[]构造。这提供了单独匹配的字符列表。因此[GIS]将匹配'G''I''S',但不匹配'GIS'

WHERE -- Special case GIR 0AA
      postcode <> 'GIR 0AA' and -- Need to exclude these from results
      postcode not like 'PFPO [0-9][0-9][0-9]' and
      postcode not like '[A-Z][A-Z][0-9][0-9] [0-9][A-Z][A-Z]' and
      postcode not like '[A-Z][A-Z][0-9][A-Z] [0-9][A-Z][A-Z]' and
      postcode not like '[A-Z][0-9][0-9] [0-9][A-Z][A-Z]' and
      postcode not like '[A-Z][A-Z][0-9] [0-9][A-Z][A-Z]' and
      postcode not like '[A-Z][0-9][A-Z] [0-9][A-Z][A-Z]'and
      postcode not like '[A-Z][0-9] [0-9][A-Z][A-Z]'

如果邮政编码嵌入在较长的字符串中,您可能需要'%'在模式的开头,结尾或开头和结尾。

答案 1 :(得分:1)

你需要更具体一点。通过说patindex('[BFPO] [1-500]', postcode),您希望它检查1到500之间的任何数字,但这不是PATINDEX的工作方式。同样,对于GIR 0AA,没有理由使用PATINDEX,因为它是一个非常具体的案例。这在我的最小测试中起作用了:

Where   patindex('BFPO [1-9]', postcode) = 0
    And patindex('BFPO [1-9][0-9]', postcode) = 0
    And patindex('BFPO [1-4][0-9][0-9]', postcode) = 0
    And postcode <>'BFPO 500'
    And postcode <> 'GIR 0AA'

BFPO 1-500分为四个不同的可能范围:1-9,10-99,100-499和500.然后专门检查GIR 0AA

答案 2 :(得分:0)

patindex('[GIR] [0AA]', postcode) = 0实际上搜索的字符串包含'G','I'或'R'后跟空格,然后是'0','A'或'A'。因此patindex('[GIR] [0AA]', 'G 0')会像patindex('[GIR] [0AA]', 'R A')那样返回1。

您实际需要的是:

postcode <> 'GIR 0AA'

patindex('[G][I][R] [0][A][A]', 'GIR 0AA') = 0

patindex('GIR 0AA', 'GIR 0AA') = 0