Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 其中,某些列中的结果为空_Sql_Sql Server - Fatal编程技术网

Sql 其中,某些列中的结果为空

Sql 其中,某些列中的结果为空,sql,sql-server,Sql,Sql Server,我试图减少每天在表中插入的行数 在大约5%到10%的数据中,我得到的只是主键值。 我想知道是否有任何方法可以只选择获得超过PK值的行 例如,我现在得到的结果: PK1 PK2 cl1 cl2 cl3 cl4 --------------------------------------------------------------------------- a Louis null null 171 15 a Jack 13

我试图减少每天在表中插入的行数

在大约5%到10%的数据中,我得到的只是主键值。 我想知道是否有任何方法可以只选择获得超过PK值的行

例如,我现在得到的结果:

PK1    PK2    cl1    cl2    cl3    cl4
---------------------------------------------------------------------------
a      Louis  null   null   171    15
a      Jack   13     null   null   null
a      Marty  17     14     130    null
b      Louis  10     11     110    12
b      Jack   03     null   185    null
b      Marty  null   null   null   null
c      Louis  16     48     null   25
c      Jack   null   null   null   null
c      Marty  13     null   null   64
d      Louis  null   null   null   null
d      Jack   21     12     165    null
d      Marty  null   null   null   null
我期望的结果是:

PK1    PK2    cl1    cl2    cl3    cl4
---------------------------------------------------------------------------
a      Louis  null   null   171    15
a      Jack   13     null   null   null
a      Marty  17     14     130    null
b      Louis  10     11     110    12
b      Jack   03     null   185    null

c      Louis  16     48     null   25

c      Marty  13     null   null   64

d      Jack   21     12     165    null
SQL中是否有任何可能更改为该值的请求?现在我用下面这个

SELECT 
    table.PK1,table.PK2,
    table.cl1,table.cl2,table.cl3,table.cl4,
FROM
    datatable table
提前谢谢

编辑:这是一个例子,有一百多列不是pk,我不想用where过滤。或者在最坏的情况下,您可以使用该功能。它接受任意数量的参数并返回第一个非空参数。例如:

select coalesce(3, 1, 4);            -->  3
select coalesce(3, null, 4);         -->  3
select coalesce(null, 1, 4);         -->  1
select coalesce(null, null, 4);      -->  4
select coalesce(null, null, null);   -->  null
您可以使用此选项检查所有列是否为空:


最简单的方法就是显式删除所有为空的行:

其实没有捷径可走。虽然可以使用coalesce,但这会阻止在查询中使用索引,但无论如何都不会使用索引

如果确实需要此查询的性能,可以添加计算列:

alter table t add num_nulls as ( (case when col1 is null then 1 else 0 end) + (case when col2 is null then 1 else 0 end) + . . . );

然后可以在tnum_nulls上添加索引,并在where子句中使用它。对于筛选出5-10%的行,这是无效的。但是如果你想过滤掉98%,那么它的性能会更好。

如果你不想写列名,你可以这样做

DECLARE @query NVARCHAR(MAX);

SELECT @query = ISNULL(@query+', ','') + [name] 
                FROM  sys.columns 
                WHERE object_id = OBJECT_ID('yourTableName') 
                AND  [name] != 'PK1' AND  [name] !=  'PK2';

SET @query = N'SELECT * FROM TmpTable WHERE COALESCE('+ @query +') IS NOT NULL';

EXECUTE(@query)
当所有列cl1、cl2、cl3、cl4、…、cln=null值均为null时(前两列或指定的列除外),将忽略一行。PK1、PK2

输出


其中,COALESCEcl1、cl2、cl3、cl4为[NOT]NULL。如果您需要一个针对可变列数的解决方案,这会更复杂,但对于任何动态SQL和sys.columns仍然是可行的。如果问题仅仅是手指厌倦了键入所有这些列,请使用SSMS脚本表的脚本功能,如->选择到->新建查询编辑器窗口。一个解决方案,你真的没有提到其他列在所有。。。我没看到那个。可能是带有*和校验和的东西,但我不会尽可能信任这样的构造。如果您的表非常稀疏,即使消除了所有为空的行,您也可能从和列集合中获得一些好处。请注意,这是一个非常利基的功能,它是专门用来支持SharePoint的,基本上;你应该仔细检查它是否有用。但从理论上讲,可以非常有效地检查列集合中是否存在任何值。因此,您需要的是,对动态列进行空值检查,对吗?如果您不想在何处进行筛选,那么您就倒霉了。没有空格的查询很难读取。
alter table t add num_nulls as ( (case when col1 is null then 1 else 0 end) + (case when col2 is null then 1 else 0 end) + . . . );
DECLARE @query NVARCHAR(MAX);

SELECT @query = ISNULL(@query+', ','') + [name] 
                FROM  sys.columns 
                WHERE object_id = OBJECT_ID('yourTableName') 
                AND  [name] != 'PK1' AND  [name] !=  'PK2';

SET @query = N'SELECT * FROM TmpTable WHERE COALESCE('+ @query +') IS NOT NULL';

EXECUTE(@query)