【问题标题】:SQL WHERE clause not returning rows when field has NULL value当字段具有 NULL 值时,SQL WHERE 子句不返回行
【发布时间】:2011-06-09 12:14:54
【问题描述】:

好的,我知道这个问题了:

当 SET ANSI_NULLS 为 ON 时,所有与空值的比较结果为 UNKNOWN

但是,我正在尝试查询DataTable

我可以添加到我的查询中:

OR col_1 IS NULL OR col_2 IS NULL

对于每一列,但我的表有 47 列,并且我正在构建动态 SQL(字符串连接),这样做似乎很痛苦。还有其他解决方案吗?

我将在WHERE 比较中恢复所有具有NULL 值的行。

更新

给我带来问题的查询示例:

string query = col_1 not in ('Dorothy', 'Blanche') and col_2 not in ('Zborna', 'Devereaux')
grid.DataContext = dataTable.Select(query).CopyToDataTable();

(如果/当col_1 = null 和/或col_2 = null 时不检索行)

【问题讨论】:

  • 请举例说明导致您遇到问题的查询类型。
  • 如果你的列都是字符串,一个非常肮脏的方法是创建一个列,它是你查询的所有列的连接,然后检查它是否为空:)
  • 如果您必须对许多相同类型的列执行相同的测试,我的猜测是这些值应该放在一个单独的表中,并带有第一个表的外键。但在您发布表模式之前,无法确定。
  • 仅供参考:我不是在查询实际的 DBMS!!!

标签: c# sql datatable


【解决方案1】:

所以你的意思是(例如 2 列)

WHERE (col1 = 'abc' or col1 is null)
  AND (col2 = 3 or col2 is null)

但是你想总是包含空值吗? 这应该工作

WHERE isnull(col1,'abc') = 'abc'
  AND isnull(col2, 3) = 3

【讨论】:

  • 我只是在你的第一个例子中,但没有WHERE/AND。示例:(col_1 not in ('Sophia', 'Rose') or col_1 is null) and (col_2 not in ('Petrillo', 'Nylund') or col_2 is null)
【解决方案2】:

您这样做是因为您想要获取 NULL 值,还是因为您不希望 NULL 值干扰您的比较?

例如,这个:

WHERE col_1 != 'John'

不会返回 col_1 为 NULL 的任何行(您已在问题中表明您知道这一点)。

如果您尝试使用上述 WHERE 子句返回 col_1 IS NULL 行,则在 MS SQL 中有两个选项(一个在 mySql 中)。

在 MS SQL 和 mySql 中,coalesce() 函数将允许您进行此类比较。在 MS SQL 中(我相信 mySql 也是如此),它的功能是接受两个或多个参数,并按顺序计算它们,返回它找到的第一个非 NULL 参数。在 MS SQL 中,有一个叫isNull() 的速记函数,它类似于coalesce(),但只接受两个参数。

在上面的示例中,您将执行以下操作:

WHERE coalesce(col_1,'') != 'John'

这将返回 col_1 IS NULL 的行以及 col_1 中不等于 'John' 的非 NULL 值的行。

如果这是您的真正目标,那么该技术应该适合您。

【讨论】:

  • +1:如果我使用的是 DBMS,您的建议非常适合处理这种情况,但这个问题是关于 C# 中的 DataTable.Select()
  • 对不起,我不懂 C#,并根据您帖子上的 sql 标签做出响应。希望有 C# 专家能比我更好地帮助你!
猜你喜欢
  • 1970-01-01
  • 2021-07-27
  • 1970-01-01
  • 2014-02-14
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 2014-09-18
  • 1970-01-01
相关资源
最近更新 更多