2

データベースから列を抽出してリストに保存したいと考えています。今は動作しますが、NULL 値です。元のデータベースの列の値は次のとおりです。

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

「NULL」がたくさんあることがわかります。「NULL」を1つだけ取得したい。私のコードの結果には、多くの空の文字列が含まれていました。

"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、null 値は互いに重複していると見なされます。がステートメントにDISTINCT含まれている場合、null 値がいくつ検出されても、結果には 1 つだけが返されます。SELECTNULL

COALESCE:

引数の中で最初の非 null 式を返します。

于 2012-04-04T13:22:38.557 に答える
1

明確な結果が必要であることを指定しないのはなぜですか?

string commandtext = "select DISTINCT QO FROM [T1]";
于 2012-04-04T13:22:21.033 に答える
1

ISNULL(またはIFNULLMySqlで)使用できます:

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 に答える
0

「DISTINCT」キーワードを含めるように SQL コマンド テキスト (投稿していない) を変更します。これにより、NULL 以外のデータも重複除外されることに注意してください。NULL が 1 つだけ必要で、それ以外は重複する場合は、クエリを変更して 2 つのサブセットの 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 のコンテキストに基づく例外があります。

于 2012-04-04T13:22:48.633 に答える
-1

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(); 
    }
}
于 2012-04-04T13:26:39.820 に答える