У меня есть таблица, которая содержит почтовые индексы для клиентов, они хранятся в виде типа nvarchar и содержат комбинацию буквенно-цифровых символов, например, «YO41 1LZ», и числовых, например, 12345 почтовых индексов.У меня также есть таблица, которая содержит действительные почтовые индексы, предоставляемые курьерской компанией, которую мы используем для доставки товаров.Их данные хранятся с postcode1 и postcode2 в каждой строке.Эти значения представляют собой диапазоны, в которых действительны все почтовые индексы, например, postcode1 = 1234 и postcode2 = 2345, поэтому 2321 является действительным, а 1231 - нет.Эти строки также содержат буквенно-цифровые значения, такие как «YO41», и хранятся в виде типа varchar.
Я хочу сделать ссылку на эту таблицу, чтобы при запросе сведений о компании, включая адрес, она также возвращала битовый флаг длясохраненный почтовый индекс совместим со списком, предоставленным курьерской компанией.Упрощенная версия запроса, который я написал, приведена ниже.
Проблема в том, что, когда почтовый индекс числовой, мне нужно делать числовое сравнение почтовых индексов, но когда алфавитно-цифровое сравнение строк.В приведенном ниже запросе выдается ошибка «Преобразование не выполнено при преобразовании значения nvarchar 'YO41 1LZ' в тип данных int."Я думаю, проблема в том, как я использую CAST.Кто-нибудь знает лучший способ сделать это, пожалуйста?
SELECT
company.companyname,
address.line1,
address.line2,
address.postcode,
CASE
WHEN courierpostcodes.postcodeid IS NOT NULL
THEN 1
ELSE 0
END AS postcodeValid
FROM
company
JOIN address
ON company.companyid = address.companyid
LEFT OUTER JOIN courierpostcodes
ON (ISNUMERIC(courierpostcodes.postcode1) = 1 AND ISNUMERIC(address.postcode) = 1
AND CAST(address.postcode AS int) BETWEEN CAST(courierpostcodes.postcode1 AS int) AND CAST(courierpostcodes.postcode2 AS int))
OR
((ISNUMERIC(courierpostcodes.postcode1) = 0 OR ISNUMERIC(address.postcode) = 0)
AND CAST(address.postcode AS nvarchar) BETWEEN CAST(courierpostcodes.postcode1 AS nvarchar) AND CAST(courierpostcodes.postcode2 AS nvarchar))
WHERE
company.id = *mycompanyid*