我在选择特定邮政编码时遇到问题。
这些都是有效的英国邮政编码格式:
现在,说我在数据表中混合了以上格式;我试图仅选择符合WV1前缀的邮政编码(在此示例中)。
在以上6项列表中,我想返回:
我想排除:
如果执行以下查询,这将同时带回WV11
和WV1
:
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。
WHERE ad.PostCode like 'WV1 [0-9][A-Z][A-Z]' OR
ad.PostCode like 'WV1[0-9][A-Z][A-Z]'