Sql 其中,某些列中的结果为空
我试图减少每天在表中插入的行数 在大约5%到10%的数据中,我得到的只是主键值。 我想知道是否有任何方法可以只选择获得超过PK值的行 例如,我现在得到的结果: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
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)