Sql server SQL-删除(消除)没有数据的列
我想知道; 在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
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