2

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

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]";

4

5 回答 5

4

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

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

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

COALESCE

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

于 2012-04-04T13:22:38.557 回答
1

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

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

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

于 2012-04-04T13:20:42.740 回答
1

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

string commandtext = "select DISTINCT QO FROM [T1]";
于 2012-04-04T13:22:21.033 回答
0

更改您的 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 时存在问题,因为它在其平等比较器中从未将它们视为平等。在 ANSI SQL NULL 处理中,这也被视为不相同,但基于上下文的 DISTINCT、GROUP BY 存在异常。

于 2012-04-04T13:22:48.633 回答
-1

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

while (reader.Read())
{
    if (reader[col] == DBNull){
        str = "";
        if(!blNullFound){            
            sRetVal.Add(str);
        }
        blNullFound = true;
    } else {
        str = reader[col].ToString(); 
    }
}
于 2012-04-04T13:26:39.820 回答