JOIN中的CASE语句对不同的数据类型

时间:2015-07-14 09:30:30

标签: sql sql-server case

我想知道是否可以在CASE上使用JOIN语句,其中CASE返回的参数属于不同类型。

我尝试用一​​个例子更好地解释我的问题: 我有2个表:TAB1TAB2。 在table 2的列中,我有一些参数除以管道字符" |"。

取决于我需要加入TAB1的特定列的第一个参数的长度。但在一种情况下,TAB1列的值为integer,另一列为varchar

我试过了:

select *
from TAB1 as T1
    inner join TAB2 as T2
        on isnull(nullif(substring(T2.PARAM, 0, charindex('|', T2.PARAM, 1)),''), T2.PARAM) =
        case
            when len(isnull(nullif(substring(T2.PARAM, 0, charindex('|', T2.PARAM, 1)),''), T2.PARAM)) >= 16
                then T1.CODFIS
            when isnull(nullif(substring(T2.PARAM, 0, charindex('|', T2.PARAM, 1)),''), T2.PARAM)  < 16
                then T1.ID
        end  

但它返回错误:

  

转换varchar值时转换失败&#39; PAACPP70H41B296Y&#39;数据类型int。

1 个答案:

答案 0 :(得分:0)

假设T1.ID属于integer类型。 input_expression和每个when_expressio n的数据类型必须相同或必须是隐式转化

SELECT *
FROM   TAB1 AS T1
       INNER JOIN TAB2 AS T2
 ON Isnull(NULLIF(Substring(T2.PARAM, 0, Charindex('|', T2.PARAM, 1)), ''), T2.PARAM) 
 = CASE
      WHEN Len(Isnull(NULLIF(Substring(T2.PARAM, 0, Charindex('|', T2.PARAM, 1)), ''), T2.PARAM)) >= 16 THEN T1.CODFIS
      WHEN Isnull(NULLIF(Substring(T2.PARAM, 0, Charindex('|', T2.PARAM, 1)), ''), T2.PARAM) < 16 THEN CONVERT(VARCHAR(50), T1.ID)
    END 
                                                                                                      END