Сервер MS SQL приведен к объединениям таблиц - PullRequest
0 голосов
/ 22 июня 2011

У меня есть таблица, которая содержит почтовые индексы для клиентов, они хранятся в виде типа 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*

1 Ответ

0 голосов
/ 22 июня 2011

Я думаю, что гораздо лучший подход - хранить все действующие почтовые индексы в таблице напрямую, а не в виде диапазонов. Это позволяет вам установить правильные отношения с внешним ключом, которые, как я ожидаю, будут гораздо более эффективными, а также позволят вам сохранить больше здравомыслия.

...