SQL Сервер - если столбцы не существуют, создать столбец - PullRequest
0 голосов
/ 07 января 2020

У меня есть пример таблицы (#temp), такой как:

Account    ABC      DEF     GHI     
-----------------------------------
A001       1000.00  NULL    NULL    
A002       NULL     500.00  800.00  
A003       NULL     700.00  NULL    
A004       1100.00  NULL    NULL    

Заголовки AB C, DEF, GHI являются результатом разворота. Я хотел бы:

select 
    *,
    case 
       when ABC is not NULL and JKL is not NULL 
          then 1 
          else 0 
    end as newColumn 
from 
    #temp

Это ошибка, потому что JKL не существует. Однако оно может существовать и должно учитываться, когда оно существует. Как я могу отредактировать оператор запроса, чтобы проверить, существуют ли столбцы AB C и JKL>, если они не существуют, то 0 value>, если они существуют, и либо имеют значение null, то 0 value>, если они оба не равны NULL, то 1 value в новом столбце.

Ответы [ 2 ]

1 голос
/ 07 января 2020

Поскольку вы используете временную таблицу, это немного уродливо, но, возможно, что-то вроде этого будет работать:

IF NOT EXISTS (SELECT 1 
               FROM tempdb.sys.tables t
                    JOIN tempdb.sys.columns c ON t.object_id = c.object_id
               WHERE t.name LIKE N'#temp[_]%'
                 AND c.[name] = N'JKL')
    ALTER TABLE #Temp ADD JKL int;

DECLARE @SQL nvarchar(MAX),
        @CRLF nchar(2) = NCHAR(13) + NCHAR(13);
--Need dynamic SQL, as the batch will fail still otherwise
SET @SQL = N'SELECT *,' + @CRLF + 
           N'CASE WHEN ABC IS NOT NULL AND JKL IS NOT NULL THEN 1 ELSE 0 END AS newColumn' + @CRLF + 
           N'FROM #temp;'

EXEC sp_executesql @SQL;

Если JKL должно иметь значение не NULL, используйте следующее для ALTER:

    ALTER TABLE #Temp ADD JKL int DEFAULT 0 WITH VALUES;
0 голосов
/ 08 января 2020

Я смог дополнить:

IF NOT EXISTS (select 1
    from tempdb.sys.tables t
        inner join tempdb.sys.columns c
        on t.object_id = c.object_id
    where t.Name like '%temp%' AND
        c.Name = 'JKL')
ALTER TABLE #temp ADD JKL int;

select * from #temp 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...