如果sql中的表中不存在列,请选择列的值

时间:2015-04-15 06:06:43

标签: sql sql-server sql-server-2008 select

我有一张桌子" ExcelData"如下所示:

Id   [Title 1]   [Title 2]    [Address 1]  [Address 2]    City  State
1      A1          A2           add1         add2         X      Y
2      B1          B2           add1         add2         X      Y

我需要一个字符串形式的查询,在检查每个列是否存在于表中后,从上表中获取结果。

Declare @strSQL nvarchar(max), @RecId int
set @RecId = 1

--- while循环将存在于@Count变量中。我的疑问是:

set @strSQL = 'SELECT CASE WHEN EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='ExcelData' and COLUMN_NAME='[Title ' + CONVERT(nvarchar(10), @Count)) THEN(SELECT '[Title ' + CONVERT(nvarchar(10), @Count)]'
FROM ExcelData where ExcelData.Id = '+ @RecId +') ELSE NULL END AS [Title]
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='ExcelData' and COLUMN_NAME='[Email]' THEN(SELECT '[Email]' FROM ExcelData where ExcelData.Id = '+ @RecId +') ELSE NULL END AS [Email])'

Execute(@strSQL)

如果表中存在列,那么我需要结果,如果不存在,那么查询应该在列值中返回null,如下所示:

期望的结果:

[Title 1]  [Title 2]  [Email]
   A1        A2        NULL

但我没有得到理想的结果。

1 个答案:

答案 0 :(得分:1)

这应该动态地获取[Title 1],[Title 2],[Email]列的值(如果它们存在),并在@RecId上有一个循环。如果您可以有多个Title / Address列,则还应该实现@Count变量。

DECLARE @strSQL nvarchar(max), 
        @RecId int

SET @RecId = 1

WHILE EXISTS (SELECT TOP 1 1 FROM ExcelData WHERE Id = @RecId)
BEGIN
    SET @strSQL = '
    SELECT '+
        (case when exists (select *
                           from INFORMATION_SCHEMA.COLUMNS 
                           where table_name = 'ExcelData' and
                                 column_name = 'Title 1' 
                          )
              then '[Title 1]'
              else 'NULL AS [Title 1]'
         end) + ', ' +
        (case when exists (select *
                           from INFORMATION_SCHEMA.COLUMNS 
                           where table_name = 'ExcelData' and
                                 column_name = 'Title 2' 
                          )
              then '[Title 2]'
              else 'NULL AS [Title 2]'
         end) + ', ' +
         (case when exists (select *
                           from INFORMATION_SCHEMA.COLUMNS 
                           where table_name = 'ExcelData' and
                                 column_name = 'Email' 
                          )
              then '[Email]'
              else 'NULL AS Email'
         end) + '
    FROM ExcelData
    WHERE Id = ' + CAST(@RecId AS varchar(50))

    EXEC sp_executesql @strSQL

    SET @RecId = @RecId + 1
END

结果是:

Title 1 Title 2 Email
A1      A2      NULL

Title 1 Title 2 Email
B1      B2      NULL