Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.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
用于获取起始和结束null之间的数据的SQL查询_Sql - Fatal编程技术网

用于获取起始和结束null之间的数据的SQL查询

用于获取起始和结束null之间的数据的SQL查询,sql,Sql,我在某个项目中得到了一个需求,我需要从一个表中选择数据,在这个表中,我需要选择从空值开始的顶部值,然后再选择一些空值和其他数据 假设表名是数据,其中有一列名为Company 公司 无效的 无效的 无效的 谷歌 微软 神谕 无效的 无效的 联系在一起 啁啾 脸谱网 无效的 无效的 简单地说,我需要编写一个查询,选择{Google,Microsoft和Oracle}作为结果,而不选择其他内容。。。。这只是一个样本数据,不是我的实际项目 此数据在起始null和结束null之间可以有数百个值 请提供您的

我在某个项目中得到了一个需求,我需要从一个表中选择数据,在这个表中,我需要选择从空值开始的顶部值,然后再选择一些空值和其他数据

假设表名是数据,其中有一列名为Company

公司 无效的 无效的 无效的 谷歌 微软 神谕 无效的 无效的 联系在一起 啁啾 脸谱网 无效的 无效的 简单地说,我需要编写一个查询,选择{Google,Microsoft和Oracle}作为结果,而不选择其他内容。。。。这只是一个样本数据,不是我的实际项目 此数据在起始null和结束null之间可以有数百个值

请提供您的输入以编写此类查询
谢谢

假设ID是用来维持秩序的。。。你可以这样做。这只需找到第一个非空ID,然后找到下一个空ID-1作为其范围

SELECT *
FROM COMPANY
WHERE ID BETWEEN
    ( SELECT MIN(ID)  
      FROM   COMPANY
      WHERE  COMPANY_NAME IS NOT NULL ) AND
    ( SELECT MIN(ID) - 1
      FROM   COMPANY
      WHERE  COMPANY_NAME IS NULL
      AND    ID > ( SELECT MIN(ID) MIN_ID 
                    FROM   COMPANY
                    WHERE  COMPANY_NAME IS NOT NULL ) ) 
或者您可以使用分析函数,如果您的DBMS中有分析函数,这可能会更好

最简单的方法是使用滞后:

如果没有延迟,我将使用相关子查询:

select d.*
from (select d.*, 
             (select d2.company
              from data d2
              where d2.id < d.id
              order by d2.id desc
              limit 1
             ) as prev_company
      from data d
     ) d
where prev_company is null and company is not null;

请注意,在某些数据库中,限制可能是仅获取第一行或选择top 1或其他构造。

SQL表本身就是无序的,因此没有下一行的概念,除非您有一列指定顺序,例如自动递增的id或时间戳。假设我有一个自动递增的id和公司列非常感谢您的即时回复。。。这真的很有帮助。。。你能给我举一个解析函数的例子吗。。。事实上这就是我真正想要的。。。再次感谢!您正在使用哪个数据库?
select d.*
from (select d.*, 
             (select d2.company
              from data d2
              where d2.id < d.id
              order by d2.id desc
              limit 1
             ) as prev_company
      from data d
     ) d
where prev_company is null and company is not null;