我在MS SQL中运行一个非常有条件的查询。我继承了这个数据库,它的结构无法改变。由于设计不佳,一个字段(PlantName)可以容纳一个字符串或一个用于引用另一个表(SoilSpecies)中的字符串的int。我试图在一个查询中保持这一切,我正在尝试将SoilSpecies表放在左外连接上。问题我无法将许多行中的PlantName字符串与SoilSpecies上的Int主键进行比较。
示例将是:
“将nvarchar值'rose'转换为数据类型int时转换失败。”
我想知道是否有可能有条件地将字段的内容设置为'0',如果它不是为了连接的目的而在INT上。
select distinct sv.sampleno, sv.plantName,
sv.tests, sv.plantNameOther, sv.originalsubmitContact,
sv.sampletype, sv.test_foliar, sv.form,
COALESCE (ci.clname, BTE_Customer.name) AS clname,
o.officename,
CAST(di.id as BIT) as DIAGIMAGES,
sv.PlantLocation,
CASE
WHEN (sv.form = 'soils') THEN sv.plantName
ELSE NULL
END
AS sampleType,
CASE
WHEN (sv.form = 'soils') THEN ss.name
ELSE NULL
END
AS ssName
from searchview sv
left outer join clientinfo ci on
sv.clientid = ci.clientid
left outer join BTE_Customer on
BTE_Customer.BTE_ID = sv.BTE_ID
left outer join BTE_CustomerProperty on
sv.BTE_ID = BTE_CustomerProperty.BTE_ID AND sv.Property_ID = BTE_CustomerProperty.Property_ID
left outer join offices o on
sv.officeID = o.officeID
left outer join reply r on
sv.sampleno = r.sampleno
left outer join diagnosticimages di on
sv.sampleno = di.sampleno
left outer join SoilsSpecies ss on
(sv.plantname = ss.name) or (sv.plantname = ss.SpeciesID)
WHERE (not sv.sampleno = 0)
and form in ('Soils','Plants')
AND (ci.clname like '%NAME%' or BTE_Customer.name like '%NAME%')
答案 0 :(得分:1)
您需要一个短路运算符(CASE)来避免类型不匹配。我还没有真正测试过它,但你可能会尝试类似下面的内容。将您的加入更改为SoilsSpecies,如下所示:
left outer join SoilsSpecies ss on
1 = case when isnumeric(sv.plantname) = 1 then
case when sv.plantname = ss.SpeciesID then 1 end
when sv.plantname = ss.name then 1
else 0
end
答案 1 :(得分:0)
我不知道这是否是处理此问题的最佳方式,但它有效。我只是能够将外部表中的INT字段转换为NVARCHAR,并将其与原始表中的字符串字段进行比较。这样我在不匹配的行中得到空值。这是我正在寻找的逻辑,我只是稍后检查Nulls。
我用以下内容替换了我的上一次LEFT OUTER JOIN:
left outer join SoilsSpecies ss on
(CONVERT(nvarchar,ss.speciesID) = sv.plantname)