2015-09-04 100 views
1

我一直試圖從CASE(def.OPTION_CATEGORY_ID)中選擇一個文本結果,但我很難實施條款。如何僅在列存在時使用SQL列名稱?

我想要做的是檢查是否OPTION_CATEGORY_ID是sys.columns中的現有列。如果是,那麼我試圖通過在底部使用When - Then來進行文本翻譯,但SQL不知道列名,所以CASE(def.OPTION_CATEGORY_ID)由於列名無效而失敗。

有什麼辦法可以使用別名調用def.OPTION_CATEGORY_ID,這樣SQL就不會讓它事先失效嗎? 感謝

SELECT DISTINCT * 
    FROM 
     (SELECT def.OPTION_DEF_ID AS 'Def ID', 
       ass.ASSET_NAME AS 'Asset Name', 
       CASE(def.OPTION_TYPE_ID) 
        WHEN 1 THEN 'A' 
        WHEN 2 THEN 'B' 

       END AS 'Option Type', 
       case when exists (SELECT name 
       FROM sys.columns 
       WHERE Name = 'OPTION_CATEGORY_ID' 
        AND Object_ID = Object_ID(N'TFC_OPTION_DEFINITION')) 

    then 
     -- Column Exists 
     CASE(def.OPTION_CATEGORY_ID) 
        WHEN 1 THEN 'C' 
        WHEN 2 THEN 'D' 
        WHEN 3 THEN 'E' 
        WHEN 4 THEN 'F' 


       end 
       End AS 'test' , 

     -- the rest of the select 
+2

你試圖做太多一次。這種「SQL-SQL」不起作用。你需要做的是查詢模式,並生成一個單一的字符串變量,它包含一個新的SQL語句*(寫SQL的SQL)*。然後,作爲一個單獨的步驟,您可以使用'EXEC sp_executesql'作爲SQL語句運行該字符串,該EXEC sp_executesql還支持參數化查詢。 Google'Dynamic-SQL和SQL-Server'獲取更多細節。 – MatBailie

+0

這個要求背後的目標是什麼?也許有一個更簡單的方法去那裏... – Paolo

+0

我的數據庫可能並且可能沒有在def中的列「OPTION_CATEGORY_ID」。 我想在這兩種情況下使用相同的查詢,但是當它存在時,我希望底部情況爲int ID生成正確的文本轉換。 –

回答

2

如果你想選擇一列,你不知道,如果它存在,你不能把它寫在明確你的代碼,並期望它來編譯。

你應該建立動態的基於該列的存在與否的運行時間信息的聲明:

DECLARE @statement VARCHAR(MAX) 

IF((SELECT COUNT(*) 
       FROM sys.columns 
       WHERE Name = 'OPTION_CATEGORY_ID' 
        AND Object_ID = Object_ID(N'TFC_OPTION_DEFINITION')) > 0) 
BEGIN 
SET @statement = --assign a query which uses OPTION_CATEGORY_ID 
END 
ELSE 
BEGIN 
SET @statement = --assign a query which does not use OPTION_CATEGORY_ID 
END 

EXEC sp_executesql @statement 
+0

感謝您的幫助 –

相關問題