TSQL CASE для нескольких столбцов - PullRequest
1 голос
/ 06 ноября 2011
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. В этих полях нет записей с несколькими значениями.

Таким образом, в основном некоторые записи будут иметь значения FacebookID, некоторые другие имеют TwitterID, некоторые другие имеют LinkedInID.

ВОПРОСЫ
Какой самый быстрый и чистый способ сделать это?

Выберите идентификатор, введите от @T

.... где Type - это nvarchar (10), равный либо «Facebook», либо «Twitter», либо «LinkedIn», в зависимости от того, у кого есть значение?

Ответы [ 2 ]

5 голосов
/ 06 ноября 2011

Вы можете сделать что-то вроде этого:

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>

Вы получите обратно идентификатор и один из идентификаторов ссылок для конкретной социальной сети. Если вы хотите дополнительно узнать, к какой социальной сети относится возвращенный LinkID, вы можете добавить дополнительный столбец следующим образом:

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 голосов
/ 07 ноября 2011

Каждая запись может иметь ТОЛЬКО 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)
        )
);

Какой самый быстрый и чистый способ сделать это?1010 *

Это было довольно быстро для меня, чтобы написать, используя копирование + вставка, и выглядит чистым на мой взгляд:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...