2014-10-07 109 views
6

我想執行一個SELECT,它只在該列存在的情況下選擇列值,否則顯示爲空。SQL Server如何只選擇一列存在於表中

這是目前我在做什麼:

SELECT TOP 10 CASE WHEN EXISTS 
    (SELECT * FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_SCHEMA ='test' and TABLE_NAME='tableName' and COLUMN_NAME='columnName') 
THEN columnName ELSE NULL END AS columnName 

我也試過這樣:

SELECT TOP 10 CASE WHEN 
    (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_SCHEMA ='test' and TABLE_NAME='tableName' and COLUMN_NAME='columnName') >0 
THEN columnName ELSE NULL END AS columnName 

他們都工作得很好,如果列表中存在。但是,當該列是不存在的,它給我的錯誤:

無效列名 '列名'

+3

您需要使用動態SQL。對於任何特定的查詢,它將訪問的表和列是固定的,並且如果查詢不能編譯,查詢甚至不會開始執行和檢索數據(在你的嘗試中需要這些數據)。 – 2014-10-07 07:14:25

回答

5

可以作爲寫:

SELECT CASE WHEN EXISTS 
(
    SELECT * FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_SCHEMA ='test' and TABLE_NAME='tableName' 
    and COLUMN_NAME='columnName' 
) 
THEN 
(
    SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_SCHEMA ='test' and TABLE_NAME='tableName' 
    and COLUMN_NAME='columnName' 
) 
ELSE 
NULL 
END 
AS columnName 

DEMO

編輯: 如果你正在尋找如果該列存在,則從表格列中選擇前10個值,則需要編寫如下動態查詢:

SELECT @columnVariable =  
CASE WHEN EXISTS 
(
    SELECT * FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_SCHEMA ='test' and TABLE_NAME='tableName' 
    and COLUMN_NAME='columnName' 
) 
THEN 
(
    SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_SCHEMA ='test' and TABLE_NAME='tableName' 
    and COLUMN_NAME='columnName' 
) 
ELSE 
NULL 
END 


/* Build the SQL string one time.*/ 
SET @SQLString = 
    N'SELECT TOP 10 ' + @columnVariable+ ' 
     FROM test.tableName ';  


EXECUTE sp_executesql @SQLString 

DEMO2

+0

感謝Deepkshikah – Ocelot 2014-10-08 05:29:39

0

試試這個:

SELECT 
    TOP 1 
     CASE 
      WHEN COLUMN_NAME='columnName' THEN 
       COLUMN_NAME 
      ELSE 
       NULL 
      END 
     AS COLUMN_NAME 
FROM   
    INFORMATION_SCHEMA.COLUMNS 
WHERE 
    TABLE_SCHEMA ='test' and TABLE_NAME='tableName' 
ORDER BY 
    COLUMN_NAME DESC 
0
SELECT * 
     FROM sys.columns 
     WHERE [name] = N'columnName' 
      AND [object_id] = OBJECT_ID(N'tableName') 

添加這是你的case語句裏面。請注意,此代碼只工作了更高版本的SQLSERVER的[像SQLSERVER 2008]