Отведите заданные c почтовые индексы из таблицы в SQL - PullRequest
0 голосов
/ 28 января 2020

У меня проблема с выбором указанных c почтовых кодов.

Это все действительные форматы почтовых индексов Великобритании:

  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

Если я выполню следующий запрос, это вернет как 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.

1 Ответ

1 голос
/ 28 января 2020

Я думаю, что логи c, которые вы хотите:

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

Я не уверен, разрешены ли цифры для последних трех символов.

...