无法从数据库中获取不同的NULL

本文关键字:NULL 获取 数据库 | 更新日期: 2023-09-27 18:30:11

我想从数据库中提取一列,并将其保存到列表中。现在它工作,但值为NULL。原始数据库中的列vlue为:

19506
19022
117037
NULL
1680
70659
1666
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
8113
NULL

你看有很多"NULL"。我只想得到一个"NULL"。我的代码结果得到了许多空字符串。

"19506"
"19022"
"117037"
""
"1680"
"70659"
"1666"
""
""
""
""
""
""
""
""
""
""
"8113"
""

我想要的是:

"19506"
"19022"
"117037"
""
"1680"
"70659"
"1666"
"8113"

我的代码:

public static List<string> ExecuteReader(string commandtext,string col)
    {
        List<string> sRetVal = new List<string>();
        try
        {
            using (SqlConnection cnn = new SqlConnection(conn))
            {
                cnn.Open();
                using (SqlCommand cmd = new SqlCommand())
                {
                    cmd.Connection = cnn;
                    cmd.CommandType = CommandType.Text;
                    cmd.CommandText = commandtext;
                    using (SqlDataReader reader = cmd.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            sRetVal.Add(reader[col].ToString());
                        }
                    }
                }
                cnn.Close();
            }
        }
        catch (Exception ex)
        {
        }
        return sRetVal.ToList().Distinct().ToList();
    }

谢谢。更新时间:string commandtext = "select QO FROM [T1]";

无法从数据库中获取不同的NULL

在数据库中执行DISTINCT,它会自动为您处理:

select DISTINCT COALESCE(QO,'NULL') FROM [T1]

对于DISTINCT关键字,空值被认为是彼此重复的。当DISTINCT包含在SELECT语句中时,无论遇到多少空值,结果中都只返回一个NULL

COALESCE:

返回其参数中的第一个非null表达式。

您可以使用ISNULL(或MySql中的IFNULL):

SELECT DISTINCT ISNULL(QO, '') FROM [T1]

http://msdn.microsoft.com/en-us/library/aa933210%28v=SQL.80%29.aspx

为什么不指定您想要一个不同的结果?

string commandtext = "select DISTINCT QO FROM [T1]";

更改SQL命令文本(尚未发布)以包含"DISTINCT"关键字。请注意,这也将消除非NULL数据的重复。如果您只想要一个NULL,但在其他情况下重复,您可以更改查询以对两个子集进行UNION。

所以要么:

SELECT DISTINCT QO FROM [T1]

SELECT QO FROM [T1] WHERE QO IS NOT NULL
UNION
SELECT DISTINCT QO FROM [T1] WHERE QO IS NULL -- at most one row

至于使用LINQ Distinct()对您不起作用,我认为它在比较DBNull.Value时存在问题,因为它在Equality Comparer中从不将它们视为相等。在ANSI SQL NULL处理中,这也被处理为不同,但根据DISTINCT、GROUP BY的上下文也有例外。

如果你能像Sohne说的那样做SELECT DISTINCT ISNULL (MyColumn, '') FROM MyTable,那么你就应该这样做。否则这很难看,但给你

while (reader.Read())
{
    if (reader[col] == DBNull){
        str = "";
        if(!blNullFound){            
            sRetVal.Add(str);
        }
        blNullFound = true;
    } else {
        str = reader[col].ToString(); 
    }
}