2014-09-01 104 views
-6

嗨有没有一种方法来分配case列中的多个列?在case语句中分配多个列?

我试图从另一列case语句指定两列数据,

SELECT 
    [FileName], 
    CASE 
    WHEN [FileName] LIKE 'ATE_%' THEN CAST(SUBSTRING([FileName],5,5) + '/' + 'ABTA' AS nvarchar(100)) 
    WHEN [FileName] LIKE '%Adhoc%' THEN CAST([FileName] + ' ' + [SheetName] + '/' + 'FileSheet' AS nvarchar(100)) 
    WHEN [FileName] LIKE 'AdvantageData%' THEN CAST([SheetName] + '/' + 'Sheet' AS nvarchar(100)) 
    END AS ABTA_LookUp 

这个工作,但它提出

FileName SheetName/FileSheet 

SheetName/Sheet 

89765/ABTA 

到ABTALookUp

我想它这些值出在同一个语句如果可能的话即

ABTALookUp = FileName SheetName 
    ABTASource = FileSheet 

    ABTALookUp = SheetName 
    ABTASource = Sheet 

    ABTALookUp = 89765 
    ABTASource = ABTA 
+3

CASE表达式不工作的方式。请阅读[CASE表达式的肮脏秘密](http://sqlperformance.com/2014/06/t-sql-queries/dirty-secrets-of-the-case-expression)。 – 2014-09-01 19:20:58

+0

@AaronBertrand在你的文章中,我注意到你使用'StatusLabel = CASE ...'而不是'CASE ... END作为StatusLabel'。这只是一个偏好,还是有任何其他原因使用前面的语法?我认为使用'AS'是ANSI的方式,使用'='只是为了向后兼容。 – jpw 2014-09-01 19:56:28

+2

@jpw这都是主观的。 ['='是更可读的方式,恕我直言](http://sqlblog.com/blogs/aaron_bertrand/archive/2012/01/23/bad-habits-to-kick-using-as-instead-of-for -column-aliases.aspx),尽管我的意见并不流行。试图严格遵守ANSI是毫无意义的,特别是如果没有切换平台的风险,并且代价是可读性。虽然在可读性方面我无所谓,但我确实依赖这种方式(例如,我比'GETDATE()'更喜欢CURRENT_TIMESTAMP',而''更喜欢'!='](http://sqlblog.com/blogs/ aaron_bertrand /存档/ 2008/03/20 /它使用的-or.aspx))。 – 2014-09-01 20:32:30

回答

4

你的样品所需的输出是不是在我看来都清楚分裂并放入单独的列,但也许这是你想要的?

SELECT 
    [FileName], 
    CASE 
    WHEN [FileName] LIKE 'ATE_%' THEN CAST(SUBSTRING([FileName],5,5) AS NVARCHAR(100)) 
    WHEN [FileName] LIKE '%Adhoc%' THEN CAST([FileName] + ' ' + [SheetName] AS NVARCHAR(100)) 
    WHEN [FileName] LIKE 'AdvantageData%' THEN [SheetName] 
    END AS ABTALookUp, 
    CASE 
    WHEN [FileName] LIKE 'ATE_%' THEN 'ABTA' 
    WHEN [FileName] LIKE '%Adhoc%' THEN 'FileSheet' 
    WHEN [FileName] LIKE 'AdvantageData%' THEN 'Sheet' 
    END AS ABTASource 
-7

我这样做INSTEAD感谢您的帮助

INSERT INTO ABTA_LookUp 
    SELECT [FileName] 
    ,CASE WHEN [FileName] LIKE 'ATE_%' THEN CAST(SUBSTRING([FileName],5,5)+ '/'+ 'ABTA' AS nvarchar(100)) 
      WHEN [FileName] LIKE '%Adh%' THEN CAST([FileName] + ' ' + [SheetName] + '/' + 'FileSheet' AS nvarchar(100)) 
      WHEN [FileName] LIKE 'Adva%' THEN CAST([SheetName] + '/' + 'Sheet' AS nvarchar(100)) 
      END AS [ABTA_LookUp] 
     ,NULL 
     ,NULL 
    FROM dbo.BOOK 

    UPDATE ABTA_LookUP 
    SET ABTASource = 

    (
CASE WHEN CAST(CHARINDEX('/FileSheet',[ABTA_LookUp],5)AS nvarchar) >1 THEN 'FileSheet' 
     WHEN CAST(CHARINDEX('/HQABTA',[ABTA_LookUp],5)AS nvarchar) >1 THEN 'HQABTA' 
     WHEN CAST(CHARINDEX('/ABTA',[ABTA_LookUp],5)AS nvarchar) >1 THEN 'ABTA' 
     WHEN CAST(CHARINDEX('/',[ABTA_LookUp],5)AS nvarchar) >1 THEN 'HQABTA' 
     END 
    ) 

UPDATE ABTA_LookUp   
SET DEL_SRT_PNT = CHARINDEX('/',[ABTA_LookUp],1) 

UPDATE ABTA_LookUp 
SET [ABTA_LookUp] = SUBSTRING([ABTA_LookUp],1,[DEL_SRT_PNT]-1) 
+4

为什么插入然后更新,当你可以在单个插入语句中使用两个case表达式时,就像在jpw的答案中一样? – 2014-09-01 23:06:03

+0

这不是完整列表中的case语句,它超过了50行,所以不想过载只是想了解它是否可能 我的方式将数据复制到查找中,然后将查找拆分为源代码/然后从查找中删除源文件 – LoveToys 2014-09-02 00:07:29

+4

(另外,这是一个非常可怕的主意,将其作为nvarchar长度不变,请阅读本文(http:// sqlblog。com/blogs/aaron_bertrand/archive/2009/10/09/bad-habits-to-kick-declaring-varchar-without-length.aspx),因为每次有人犯这个错误时都不值得一遍又一遍地重复) – 2014-09-02 00:10:25