我正处于需要搜索数千个邮政编码的场景中。在excel电子表格上我已经给出了它们没有间距的邮政编码。
e.g。
('PO278HI')
('PO228HI')
('PO118HI')
('PO678HI')
('PO788HI')
('PO238HI')
('PO898HI')
('PO998HI')
但是,在数据库中,邮政编码以各种格式保存。
e.g。
('PO278HI')
('PO228HI')
('PO1 18HI')
('PO678HI')
('PO788HI')
('PO23 8HI')
('PO8 98HI')
('PO99 8HI')
我可以对这些搜索进行搜索的最简单方法是什么,以便我可以返回匹配的邮政编码。
我已经尝试了一个明显没有用的IN语句,所以我尝试了像
这样的语句 postcode like ('%PO278HI%')
这在理论上有效但我正在处理如此多的邮政编码,我将永远继续添加类似的陈述。
有更快的方法吗?
由于
答案 0 :(得分:4)
从邮政编码中删除空格,然后进行比较:
SELECT *
FROM yourTable
WHERE REPLACE(postcode, ' ', '') = 'PO278HI';
答案 1 :(得分:2)
" best"确保查询邮政编码的方法是确保它们具有正确的格式,或者没有空格;简单地说。我曾经使用过几个系统,是的,用户倾向于没有放置空间,或者把它放在错误的位置。
假设我们正在谈论英国邮政编码,那么空间应始终位于最后3个字符之前,因此您最终会使用以下格式之一
1595861-1 1595861-1 2002-11-26 14:18:00.000
1595904-1 1595904-1 2002-11-24 15:15:00.000
1596298-1 1596298-1 2002-12-17 11:12:00.000
1596357-1 1596357-1 2002-12-09 19:57:00.000
1596369-1 1596369-1 2002-12-11 06:00:00.000
1596370-1 1596370-1 2002-12-19 12:31:00.000
**1596473-5** 1596473-1 2002-12-17 08:39:00.000
也有一些特殊情况。
因此,最简单的方法是在列上执行A1 1AA
A11 1AA
AA1 1AA
AA11 1AA
A1A 1AA
,具体为:
REPLACE
然后提供没有空格的邮政编码输入。但问题是,使用REPLACE(Postcode,' ','') =...
会导致查询变为非SARGable,这意味着您无法使用任何索引。
因此,根据经验,我发现您最好不要在表格中添加计算列,最好是REPLACE
。然后,您可以对该列进行查询,并对其进行索引(如果它是PERSISTED
)。
PERSISTED
然后,您可以在该表中查询ALTER TABLE YourTable ADD Postcode_NS AS REPLACE(Postcode,' ','') PERSISTED;
子句,如:
WHERE
请注意,变量周围的WHERE Postcode_NS = REPLACE(@Pcode,' ','')
不会成为SARGability的问题。