2012-11-07 80 views
0

我正在寻找从两个不同的表中拉相同的列,基于一个条件的参数。case语句一次选择多行

所以我偶然发现了我以前没有用过的CASE声明。我发现这在这个mannor中对我来说很有用,但是如果我可以做一个CASE语句,然后选择我需要的列,而不是每列执行一次,我都会喜欢它。

下面是我拥有和工作的一个例子,看起来有点多余。

SELECT TOP(10) 
    u1.userid as userid, 
    version = CASE 
     WHEN (u2.userid IS NULL OR u1.enabled = 0) 
     THEN 3 
     ELSE 4 
    END, 
    nameOrg = CASE 
     WHEN (u2.userid IS NULL OR u1.enabled = 0) 
     THEN CONVERT(NVARCHAR, u1.title) 
     ELSE CONVERT(NVARCHAR, u2.title) 
    END, 
    nameContact = CASE 
     WHEN (u2.userid IS NULL OR u1.enabled = 0) 
     THEN CONVERT(NVARCHAR, u1.contact) 
     ELSE CONVERT(NVARCHAR, u2.contact) 
    END, 
    pltName = CASE 
     WHEN (u2.userid IS NULL OR u1.enabled = 0) 
     THEN p1.name 
     ELSE p2.name 
    END 
FROM 
    usr1 u1 
LEFT OUTER JOIN 
    usr2 u2 
    ON u1.userid = u2.userid 
LEFT OUTER JOIN 
    plt2 p2 
    ON u2.pltid = p2.pltid 
LEFT OUTER JOIN 
    plt1 p1 
    ON u1.pltid = p1.pltid 

有没有建议吗?

  • 编辑mov 7,5:22:将连接添加到plt表和pltName的情况下,添加到所需的功能。

回答

0

在usr2数据集中没有匹配用户标识的情况下,所有字段都将为空。你可以使用isnull函数来使它稍微少一些,正如我在下面所做的那样,但是你不会一下子想到。

SELECT TOP(10) 
    u1.userid as userid 
    ,version = CASE 
     WHEN (u2.userid IS NULL OR u1.enabled = 0) 
     THEN 3 
     ELSE 4 
    END 
    ,CONVERT(NVARCHAR,isnull(u2.title,u1.title)) nameOrg 
    ,CONVERT(NVARCHAR,isnull(u2.contact,u1.contact)) nameContact 
FROM 
    usr1 u1 
LEFT OUTER JOIN 
    usr2 u2 
ON u1.userid = u2.userid 
+0

这是一个有用的想法,尽管它也忽略了对null表达式存在次要条件的事实。除此之外,我还添加了更多连接,条件保持不变(检查前两个表),但所使用的变量位于不同的表上,以确保我获得100%的有效答案。 –