[英]SQL Left Outer Join Conditionally
我在MS SQL中运行一个非常有条件的查询。 我已经继承了这个数据库,它的结构无法更改。 由于设计不良,一个字段(PlantName)可以容纳一个字符串或一个int,该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%')
您需要一个短路运算符(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
我不知道这是否是处理此问题的最佳方法,但它确实有效。 我只是能够将INT字段从外部表转换为NVARCHAR并将其与原始表中的字符串字段进行比较。 这样,我在不匹配的行中得到空值。 这是我一直在寻找的逻辑,稍后我只检查Null。
我用以下内容替换了我的最后一个LEFT OUTER JOIN:
left outer join SoilsSpecies ss on
(CONVERT(nvarchar,ss.speciesID) = sv.plantname)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.