搜索具有不同字符间距的邮政编码 - SQL Server

时间:2018-01-31 16:29:49

标签: sql sql-server

我正处于需要搜索数千个邮政编码的场景中。在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%')

这在理论上有效但我正在处理如此多的邮政编码,我将永远继续添加类似的陈述。

有更快的方法吗?

由于

2 个答案:

答案 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的问题。