某些列的结果为null

时间:2018-04-18 15:52:24

标签: sql sql-server

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

在大约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),我不想用"过滤"。 (或者只是在最坏的情况下)

3 个答案:

答案 0 :(得分:3)

您可以使用coalesce功能。它接受任意数量的参数并返回第一个非null参数。例如:

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

您可以使用它来检查所有列是否为null

where coalesce(col1, col2, ..., colN) is null

答案 1 :(得分:1)

最简单的方法就是明确删除所有NULL的行:

where cl1 is not null or cl2 is not null or cl3 is not 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) + . . . );

然后,您可以在t(num_nulls)上添加索引,并在where子句中使用它。为了过滤5-10%的行,这是无效的。但是如果你想过滤98%,那么它会更有效率。

答案 2 :(得分:0)

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

var extent = ol.proj.transformExtent([-14, 61, 7, 48], 'EPSG:4326', 
'EPSG:3857');
var projection = new ol.proj.Projection({
    code: 'static-image',
    units: 'pixels',
    extent: extent
});
var map = new ol.Map({
 layers: [
  new ol.layer.Tile({
        source: new ol.source.OSM()
      }),
   new ol.layer.Image({
     source: new ol.source.ImageStatic({
      url: 'https://upload.wikimedia.org/wikipedia/commons/f/fd/Ghostscript_Tiger.svg',
      projection: projection,
      imageExtent: extent
  })
})
],
target: 'map',
view: new ol.View({
center: ol.proj.transform([-1.73, 54.32], 'EPSG:4326', 'EPSG:3857'),
zoom: 5
})
});

当所有列(cl1,cl2,cl3,cl4,...,cln = null)值为空时,除前两列或您指定的列外,将忽略行。 (PK1,PK2)

输出

Output Result