【问题标题】:How do I exclude null rows without excluding null cells when pulling Excel into C# using SQL (ADO)?使用 SQL (ADO) 将 Excel 拉入 C# 时,如何排除空行而不排除空单元格?
【发布时间】:2025-12-12 22:05:02
【问题描述】:

我有如下查询:

SELECT * FROM OPENROWSET('MSDASQL', 'Driver={Microsoft Excel Driver (*.xls)};DBQ=D:\test.xls','SELECT * FROM Sheet1$]')

如果它们曾经被编辑然后被删除,这将带回所有为空的行。我想排除这些,但仍包括具有良好数据但可能为空单元格的行。

我的第一个直觉是做一个“每列不为空”的AND运算,如下所示:

SELECT * FROM OPENROWSET('MSDASQL', 'Driver={Microsoft Excel Driver (*.xls)}; DBQ=D:\test.xls', 'SELECT * FROM Sheet1$]') 在哪里 ( Col1 不为空 并且 Col2 不为空 并且 Col3 不为空 并且 Col4 不为空 )

这有效地消除了空行,但由于某种原因,也消除了 Col4 具有空条目的行。我在 WHERE 子句周围有无括号都试过了。

有没有人看到我可能做错了什么,或者作为替代方法,有没有人建议我可以使用不同的方法来实现相同的结果?

目前正在使用 ADO 在 C# 中实现,但我正在使用 Sql Server Management Studio 2008 测试查询。

【问题讨论】:

  • 好的...所以我意识到我可以在 C# 代码中做到这一点。我仍然认为这是 SQL 的奇怪行为,所以我想看看为什么这在 SQL 中不能按预期工作的答案或想法。

标签: c# sql excel null ado


【解决方案1】:
WHERE 
(
  Col1 IS NOT NULL 
  OR Col2 IS NOT NULL 
  OR Col3 IS NOT NULL 
  OR Col4 IS NOT NULL 
)

WHERE Coalesce(Col1,Col2,Col3,Col4) IS NOT NULL(oledb/excel 没有合并功能)

【讨论】:

  • 因为这是 OR'd,所以它不会排除只有一列为空的行吗?这是我不想做的事情。
  • 不,它将包括该行。想象一下,就好像您只有第一部分(col1 不为空)。那只会显示 col1 有值的行。如果 col1 为 null 但 col2 不是,您将跳过该行。所以你需要允许 col1 or col2 为空,而不是两者都为空。以此类推。