2011-11-06 109 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