从SQL表中拉回特定的邮政编码

问题描述 投票:0回答:1

我在选择特定邮政编码时遇到问题。

这些都是有效的英国邮政编码格式:

  1. WV11JX
  2. WV1 1JX
  3. WV102QK
  4. WV10 2QK
  5. WV113KQ
  6. WV11 3KQ

现在,说我在数据表中混合了以上格式;我试图仅选择符合WV1前缀的邮政编码(在此示例中)。

在以上6项列表中,我想返回:

  • WV11JX
  • WV1 1JX

我想排除:

  • WV102QK
  • WV10 2QK
  • WV113KQ
  • WV11 3KQ

如果执行以下查询,这将同时带回WV11WV1

SELECT ad.PostCode,*
FROM Staff st
INNER JOIN Address ad on ad.AddressID = st.Address
WHERE
ad.PostCode like 'WV1%'

更改WHERE中的条件以适应这样的长度也不可行:

SELECT ad.PostCode,*
FROM Staff st
INNER JOIN Address ad on ad.AddressID = st.Address
WHERE
(
ad.PostCode like 'WV1%'
OR
(ad.PostCode like 'WV1%' and LEN(ad.PostCode) = 6)

上面将只过滤出任何带有空格的格式,因此,如果我们通过以下操作满足这些格式,则可以:

SELECT ad.PostCode,*
FROM Staff st
INNER JOIN Address ad on ad.AddressID = st.Address
WHERE
(ad.PostCode like 'WV1%' and LEN(ad.PostCode) = 6)
or
(ad.PostCode like 'WV1 %' and LEN(ad.PostCode) = 7)

这解决了问题,但问题是我们不希望以这种方式检查'WV1'前缀,因此,增加'OR'比较的列表是不可行的。

我们如何以可扩展的方式隔离上述邮政编码?我正在使用Microsoft SQL Server 2016。

sql database pattern-matching sql-server-2016 postal-code
1个回答
1
投票
我认为您想要的逻辑是:

WHERE ad.PostCode like 'WV1 [0-9][A-Z][A-Z]' OR ad.PostCode like 'WV1[0-9][A-Z][A-Z]'

© www.soinside.com 2019 - 2024. All rights reserved.