Sql server SQL-删除(消除)没有数据的列

Sql server SQL-删除(消除)没有数据的列,sql-server,null,Sql Server,Null,我想知道; 在SQl中,是否可以不带无数据或零值的列 Select * from PLAYER_TABLE where PLAYER_NAME='cagri' 它只带来了一排。因为只有一个球员叫卡格里 其中有30列用于统计。 得分篮板播放分钟错误等 Score=2 Rebound=0 PlayedMinutes=2 Fauls=0 调用我的查询时,我只想看到[Score]和[PlayedMinutes]列 有可能吗?您可以在SQL中的存储过程上使用此逻辑 DDL 转换为存储过程 declar

我想知道; 在SQl中,是否可以不带无数据或零值的列

Select * from PLAYER_TABLE where PLAYER_NAME='cagri'
它只带来了一排。因为只有一个球员叫卡格里

其中有30列用于统计。 得分篮板播放分钟错误等

Score=2
Rebound=0
PlayedMinutes=2
Fauls=0
调用我的查询时,我只想看到[Score]和[PlayedMinutes]列


有可能吗?

您可以在SQL中的存储过程上使用此逻辑

DDL

转换为存储过程

declare @playername varchar(30) = 'Jordan'   --- pass this value

declare @ctr smallint = 2  -- start from ordinal 2
declare @maxctr smallint = (SELECT max(ORDINAL_POSITION)
                            FROM INFORMATION_SCHEMA.COLUMNS
                            WHERE TABLE_NAME = 'usr_testTable')

declare @columns varchar(max) = ''
declare @columnswithvalues varchar(max) = ''

declare @coltocheck varchar(30)


declare @mysql nvarchar(max)
declare @coloutput varchar(30) 

while @ctr <= @maxctr  
    begin

            SELECT @coltocheck = COLUMN_NAME
                            FROM INFORMATION_SCHEMA.COLUMNS
                            WHERE TABLE_NAME = 'usr_testTable'
                            and ORDINAL_POSITION = @ctr


          set @mysql = N'select @output = ' + @coltocheck + ' from usr_testTable where player =''' + @playername + ''' and cast(' + @coltocheck +' as float) > 0'

          EXECUTE sp_executesql    @mysql,N'@output int OUTPUT',@output = @coloutput OUTPUT;



          if @coloutput > 0 
             begin
              set @columns = coalesce(@columns + ',' + @coltocheck,@columns)
              set @columnswithvalues =  coalesce(@columnswithvalues + char(13) + char(10) + @coltocheck + ' : '  + @coloutput,@columnswithvalues)  --- text form
            end

          set @coloutput = ''

          set @ctr= @ctr + 1

    end

-- final result in table format

set @mysql = N'select player' + @columns + ' from usr_testTable where player =''' + @playername + ''' '
EXECUTE sp_executesql @mysql

-- final result in text format appended with columnname
select @columnswithvalues    -- format to display in text

首先创建动态SQL以选择表PLAYER\u表中除PLAYER\u NAME以外的所有列名称,然后将PLAYER\u表中的数据解压到表PLAYER\u表1中,然后可以搜索值0并在第二个动态SQL中选择此列

DROP TABLE PLAYER_TABLE1

DECLARE @Player NVARCHAR(50);
DECLARE @columns NVARCHAR(max); 
DECLARE @sql NVARCHAR(max);
DECLARE @columns2 NVARCHAR(max);
DECLARE @sql2 NVARCHAR(max);
SET @player='cagri'
SET @columns = Stuff((SELECT ',' 
                             + Quotename(Rtrim(Ltrim(x.columns))) 
                      FROM   (SELECT COLUMN_NAME as columns FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME= 'PLAYER_TABLE' and COLUMN_NAME<>'PLAYER_NAME' ) AS x 
                      ORDER  BY X.columns 
                      FOR xml path('')), 1, 1, ''); 
SET @sql = N' SELECT 
        PLAYER_NAME, Un_Pivot.Field, Un_Pivot.Value
    INTO PLAYER_TABLE1
    FROM
        (
         SELECT * FROM PLAYER_TABLE
        ) Data
    UNPIVOT
        (
         Value FOR Field IN ('+@columns+')
        ) AS Un_Pivot'; 
EXECUTE sp_executesql @sql;

SET @columns2 = Stuff((SELECT ',' 
                             + Quotename(Rtrim(Ltrim(y.Field))) 
                      FROM   (SELECT Field FROM PLAYER_TABLE1 WHERE VALUE<>0 AND PLAYER_NAME=@Player) AS y
                      ORDER  BY y.Field 
                      FOR xml path('')), 1, 1, '');
SET @sql2 = N'SELECT PLAYER_NAME,'+@columns2+'FROM PLAYER_TABLE WHERE PLAYER_NAME='+char(39)+@Player+char(39);
EXECUTE sp_executesql @sql2

使用动态sql,除非另有压缩,否则解决方案是一个过程而不是一行sql语句。因此,请从PLAYER_表中选择[Score],[PlayedMinutes],其中[Score]不为null,[PlayedMinutes]不为null?@scsimon。。他希望得到所有具有值的列。。表中有30列。。。如果5列有值,则返回5columns@scsimon对不起,对齐错误,马斯塔舒夫是对的。我将使用我的查询在c,它将调用它为每个球员与另一个点击。我不知道哪个玩家在哪个栏中没有数据。它在不同的玩家之间切换,所以我只想输入玩家名称,所有有价值的非零列都应该出现。对于玩家名称:cagri,它只会带来[分数]和[播放分钟]。但是对于player_name:scsimon,它将带来所有列,因为scsimon的所有列中都有数据。如果不清楚,请告诉我。当列为零/空时不选择列与返回列之间没有逻辑上的区别,因为通过省略您知道它是空的,所以从逻辑上您总是知道它的值是什么。只需始终返回所有列并让应用程序处理即可。我不知道如何将其保存为过程:但这就像sql查询一样。因此,我将通过仅更改player_名称等将其用作sql语句。。非常感谢你
DROP TABLE PLAYER_TABLE1

DECLARE @Player NVARCHAR(50);
DECLARE @columns NVARCHAR(max); 
DECLARE @sql NVARCHAR(max);
DECLARE @columns2 NVARCHAR(max);
DECLARE @sql2 NVARCHAR(max);
SET @player='cagri'
SET @columns = Stuff((SELECT ',' 
                             + Quotename(Rtrim(Ltrim(x.columns))) 
                      FROM   (SELECT COLUMN_NAME as columns FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME= 'PLAYER_TABLE' and COLUMN_NAME<>'PLAYER_NAME' ) AS x 
                      ORDER  BY X.columns 
                      FOR xml path('')), 1, 1, ''); 
SET @sql = N' SELECT 
        PLAYER_NAME, Un_Pivot.Field, Un_Pivot.Value
    INTO PLAYER_TABLE1
    FROM
        (
         SELECT * FROM PLAYER_TABLE
        ) Data
    UNPIVOT
        (
         Value FOR Field IN ('+@columns+')
        ) AS Un_Pivot'; 
EXECUTE sp_executesql @sql;

SET @columns2 = Stuff((SELECT ',' 
                             + Quotename(Rtrim(Ltrim(y.Field))) 
                      FROM   (SELECT Field FROM PLAYER_TABLE1 WHERE VALUE<>0 AND PLAYER_NAME=@Player) AS y
                      ORDER  BY y.Field 
                      FOR xml path('')), 1, 1, '');
SET @sql2 = N'SELECT PLAYER_NAME,'+@columns2+'FROM PLAYER_TABLE WHERE PLAYER_NAME='+char(39)+@Player+char(39);
EXECUTE sp_executesql @sql2