2011-11-06 66 views
1
declare @T table 
(
    ID int identity primary key, 
    FBK_ID BIGINT null, 
    TWT_ID BIGINT null, 
    LNK_ID NVARCHAR(50) null 
); 

每条记录​​只能有一个FBK_ID或一个TWT_ID或一个LNK_ID。没有记录在这些字段上有多个值。多列上的TSQL CASE

所以主要有些记录会有FacebookID值,其他一些有TwitterID,有些则有LinkedInID。

问题
什么是最快和最干净的方式来做到这一点?

选择ID,从@T

类型....其中Type是一个为nvarchar(10)等于取决于谁具有值是 '实' 或 'Twitter的' 或 'LinkedIn'?

回答

5

你可以做这样的事情:

select 
ID , 
case when FBK_ID is not null then FBK_ID 
    when TWT_ID is not null then TWT_ID 
else LNK_ID end as LinkID 
from @t 
where <rest of your conditions if any> 

你会回来的ID和链路ID为特定的社交网络之一。如果你想知道,另外,以确实的链路ID返回什么样的社会网络的属于,你可以添加一个额外的列像这样:

select 
ID , 
case when FBK_ID is not null then FBK_ID, 
    when TWT_ID is not null then TWT_ID 
else LNK_ID end as LinkID, 
case when FBK_ID is not null then 'F' 
    when TWT_ID is not null then 'T' 
else 'L' end as LinkIDFrom 
from @t 
where <rest of your conditions if any> 
+0

酷......我不知道ü可以在同一个测试各个领域案件。谢谢 !!! –

0

每个记录只能有一张FBK_ID或TWT_ID或LNK_ID。没有 记录在这些字段上有多个值。

首先解决您的表:

DECLARE @T TABLE 
(
    ID INT IDENTITY PRIMARY KEY, 
    FBK_ID BIGINT NULL, 
    TWT_ID BIGINT NULL, 
    LNK_ID NVARCHAR(50) NULL, 
    CHECK (
     (FBK_ID IS NOT NULL AND TWT_ID IS NULL AND LNK_ID IS NULL) 
     OR (FBK_ID IS NULL AND TWT_ID IS NOT NULL AND LNK_ID IS NULL) 
     OR (FBK_ID IS NULL AND TWT_ID IS NULL AND LNK_ID IS NOT NULL) 
     ) 
); 

什么是做到这一点的最快和最干净的方法是什么?

这是相当快给我写的,采用复制粘贴+,看起来干净我的眼睛:

SELECT ID, CAST('Facebook' AS NVARCHAR(10)) AS Type 
    FROM @T 
WHERE FBK_ID IS NOT NULL 
UNION 
SELECT ID, CAST('Twitter' AS NVARCHAR(10)) AS Type 
    FROM @T 
WHERE TWT_ID IS NOT NULL 
UNION 
SELECT ID, CAST('LinkedIn' AS NVARCHAR(10)) AS Type 
    FROM @T 
WHERE LNK_ID IS NOT NULL; 
+0

联盟而不是案例? –

+1

@Filu:是的,总有不止一种方法可以用SQL'皮肤猫';) – onedaywhen