SQL左外连接有条件

时间:2014-05-20 15:16:48

标签: sql sql-server left-join case

我在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%')

2 个答案:

答案 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)