2014-09-01 107 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