У меня проблема с выбором указанных c почтовых кодов.
Это все действительные форматы почтовых индексов Великобритании:
- WV11JX
- WV1 1JX
- WV102QK
- WV10 2QK
- WV113KQ
- WV11 3KQ
Теперь, скажем, у меня было сочетание вышеупомянутого форматы в таблице данных; Я пытаюсь выбрать только те почтовые индексы, которые соответствуют префиксу WV1 (в этом примере).
В приведенном выше списке из 6 элементов я хочу вернуть:
Я бы хотел исключить:
- WV102QK
- WV10 2QK
- WV113KQ
- WV11 3KQ
Если я выполню следующий запрос, это вернет как 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», таким образом, растущий список сравнений «ИЛИ» не жизнеспособный.
Как мы можем изолировать вышеупомянутые почтовые индексы в масштабируемой форме? Я использую Microsoft SQL Server 2016.