当前位置:  开发笔记 > 数据库 > 正文

SQL查找非空列

如何解决《SQL查找非空列》经验,为你挑选了1个好方法。

我有一个时间序列数据表,我需要找到在给定时间段内包含至少一个非空值的所有列.到目前为止,我使用以下查询:

select max(field1),max(field2),max(field3),... 
   from series where t_stamp between x and y

然后,如果结果包含非空值,则检查结果的每个字段.

该表有大约70列,一个时间段可以包含> 100k条目.

我想知道是否有更快的方法来做到这一点(仅使用标准的sql).

编辑:不幸的是,重构表设计不是我的选择.



1> Tom H..:

EXISTS操作可能会更快,因为它可以在找到符合条件的任何行(相对于您正在使用的MAX)时立即停止搜索.这取决于您的数据以及SQL服务器的智能程度.如果您的大多数列具有高速率的非空数据,则此方法将快速查找行并且应该快速运行.如果您的列大多是NULL值,那么您的方法可能会更快.我会给他们两个镜头,看看它们是如何优化的以及它们如何运行.另请注意,如果数据分布发生显着变化,性能可能会随时间而变化.

另外,我只在MS SQL Server上测试过这个.我不需要在一年多的时间内编写严格的ANSI兼容SQL代码,所以我不确定这是完全通用的.

SELECT
     CASE WHEN EXISTS (SELECT * FROM Series WHERE t_stamp BETWEEN @x AND @y AND field1 IS NOT NULL) THEN 1 ELSE 0 END AS field1,
     CASE WHEN EXISTS (SELECT * FROM Series WHERE t_stamp BETWEEN @x AND @y AND field2 IS NOT NULL) THEN 1 ELSE 0 END AS field2,
...

编辑:只是为了澄清,MAX方法可能更快,因为它可以通过数据单次传递来确定这些值.从理论上讲,这里的方法也可以,并且可能少于完整传递,但是优化器可能无法识别所有子查询都是相关的,因此它可能会为每个子查询执行单独的传递.这仍然可能更快,但正如我所说,这取决于你的数据.

推荐阅读
ifx0448363
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有