我想从数据库中提取一个列并将其保存到列表中。现在它工作但NULL值。 原始数据库中的列线索是:
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]";
答案 0 :(得分:4)
执行数据库中的DISTINCT
,它会自动为您处理:
select DISTINCT COALESCE(QO,'NULL') FROM [T1]
对于
DISTINCT
关键字,空值被视为彼此重复。当DISTINCT
语句中包含SELECT
时,结果中只返回一个NULL
,无论遇到多少空值。
返回其参数中的第一个非空表达式。
答案 1 :(得分:1)
您可以在MySql中使用ISNULL
(或IFNULL
):
SELECT DISTINCT ISNULL(QO, '') FROM [T1]
http://msdn.microsoft.com/en-us/library/aa933210%28v=SQL.80%29.aspx
答案 2 :(得分:1)
为什么不指定您想要一个明确的结果?
string commandtext = "select DISTINCT QO FROM [T1]";
答案 3 :(得分: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时遇到了问题,因为它从未在它的Equality Comparer中将它们视为相等。在ANSI SQL NULL处理中,这也处理不同,但是基于DISTINCT,GROUP BY的上下文存在例外。
答案 4 :(得分:-1)
如果你能像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();
}
}