当字段具有NULL值时,SQL WHERE子句不返回行

时间:2011-01-15 01:23:06

标签: c# sql datatable

好的,所以我知道这个问题:

  

当SET ANSI_NULLS为ON时,对空值的所有比较都计算为UNKNOWN

但是,我正在尝试查询DataTable

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

OR col_1 IS NULL OR col_2 IS NULL

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

我要带回NULL比较中WHERE个值的所有行。

更新

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

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

,则无法检索行

2 个答案:

答案 0 :(得分:5)

所以你的意思是(例如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

答案 1 :(得分:3)

你这样做是因为你想获得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中具有非NULL值的行,这些行不等于'John'。

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