如何有条件地避免选择查询中的列

时间:2016-12-29 06:46:33

标签: sql-server sql-server-2008 tsql sql-server-2012

我想有条件地从表中选择列,我只是按照link

SELECT ID,(CASE WHEN @check=0
          THEN Teacher END) 'Teacher'
FROM Register

@check =1

时的结果
---------------------
|   ID   | Teacher  |
---------------------
|   10   |  NULL    |
|   20   |  NULL    |
--------------------

在这种情况下,我不想选择Teacher列,如何执行此操作?

如果不可能如何删除所有行具有空值的列?

2 个答案:

答案 0 :(得分:2)

使用IF ELSE条件

IF @check = 0
BEGIN
    SELECT ID, Teacher 'Teacher'
    FROM Register
END
ELSE
BEGIN
    SELECT ID FROM Register
END

或使用如下的动态查询

DECLARE @qryStr VARCHAR(2000)
DECLARE @check INT =0
SET @qryStr = 'SELECT ID '+CASE WHEN @check=0 THEN ',Teacher' ELSE '' END +' FROM Register'
PRINT @qryStr
EXEC(@qryStr)

答案 1 :(得分:0)

这种动态的qry并不是个好主意。您应该重写解决方案或对表进行非规范化。

变式1:

declare @removeCol1 bit = 1
declare @removeCol3 bit = 1

declare @qry varchar(4000) = 'select col1, col2, col3, col4, col5 from dbo.yourtable'

if @removeCol1 = 1 set @qry = replace(replace(@qry, 'col1,', ''), 'col1', '')
if @removeCol3 = 1 set @qry = replace(replace(@qry, 'col3,', ''), 'col3', '')

print @qry
exec (@qry)

变体2: 在桌面上使用pivot并正确过滤。但是您的示例并不适用于示例查询。