MS SQL服务器强制转换为表连接

时间:2011-06-22 09:38:25

标签: casting

我有一个包含客户邮政编码的表格,这些邮政编码存储为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 :(得分:0)

我认为更好的方法是将所有有效的邮政编码直接存储在表中,而不是作为范围存储。这允许你做一个正确的外键关系,我希望它会更有效率,并且让你更加保持理智。