我编写了一个在我们的数据库中返回无效邮政编码的查询,见下文。它运行良好,但输出仍然返回前两行的值 - 特殊情况。
第一个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
答案 0 :(得分:3)
首先,当patindex()
更有意义时,您正在使用like
。 Like
是标准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