我有一个包含客户邮政编码的表格,这些邮政编码存储为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*
答案 0 :(得分:0)
我认为更好的方法是将所有有效的邮政编码直接存储在表中,而不是作为范围存储。这允许你做一个正确的外键关系,我希望它会更有效率,并且让你更加保持理智。