SQL Server如果仅在表中存在列时才选择列

Oce*_*lot 6 sql sql-server union select case

我想执行一个SELECT,它只在表中存在该列时才选择一个列值,否则显示为null.

这就是我目前正在做的事情:

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
Run Code Online (Sandbox Code Playgroud)

我也试过这个:

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
Run Code Online (Sandbox Code Playgroud)

如果列中存在列,则它们都能很好地工作.但是当列不存在时,它会给我错误:

列名称'columnName'无效

Dee*_*kha 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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

DEMO2