2011-09-11 27 views
0

私はこのような選択クエリでcase文を使用しています。SQLクエリのcase文のブール値

bool isActiveFlag = (bool)datareader["isActive"]; 

私は型キャストエラーを取得する - 私はado.netの 'のisActive' 列の値を読んだとき

Select col1, col2, isActive = case when col3 = 'abc' then 1 else 0 end, col4 
from <tablename> where <some condition>. 

。それはintとして戻り値です。

私は

Select col1, col2, isActive = case when col3 = 'abc' then 'true' else 'false' end, col4 
from <tablename> where <some condition>. 

にクエリを変更した場合は、この時間、戻り値が文字列であるので、私は、同じタイプのキャストエラーが発生します。基本的に私は、クエリでisActiveにブール値を代入するようにクエリを欲しいので、ブール値として読むことができます。

bool isActiveFlag = (bool)datareader["isActive"]; 

これに対処する方法はありますか。

値をintまたはstringとして読み込み、値をブール値に変換したくないです。

あなたが行うことができ
+0

は、あなたの代わりに明示的なキャストのConvert.ToBooleanを使用してみましたか? – Waqas

+0

@Waqasはい私は文字列として値を読み込み、Convert.ToBooleamを行うことができます。それは私のために働いています。私はブール値の変換を行うのではなく、ブール値として値を読み取る必要があります。 – user936405

答えて

5

bool isActiveFlag = (int)datareader["isActive"] != 0; 

あなたが使用しているDBMSた言及しなかったが、SQL Serverの場合は、のような何かを行うことができます:として、あなたの値を返す必要があります

Select col1, col2, isActive = CONVERT(bit, case when col3 = 'abc' then 1 else 0 end), col4 from <tablename> where <some condition> 

をブール製作

bool isActiveFlag = (bool)datareader["isActive"]; 

期待どおりです。

これは間違いではないが、これは、SQL Serverの各サーバーにブール型のデータ型がないためで、クエリにブールリテラルを指定する方法がないためです。 .NETはビットデータ型をboolにマップしますが、CONVERTまたはCASTを使用せずにクエリ文字列にビットリテラルを指定する方法もありません。リテラル1はすでに見たようにint値として解釈されます。

+0

私はintまたはstringとして値を読み込み、ブール値に変換できます。しかし私はなぜ私はブールとして直接読むことができないのだろうかと思っています。 – user936405

+0

詳細情報が更新されました。 – DeCaf

+0

私はMS SQLサーバーを使用しています。はいクエリのCONVERTが機能します。ありがとう。でも、なぜそれが必要なのですか? – user936405

1

別のオプション:

declare @true bit = 1 
declare @false bit = 0 

Select col1, col2, isActive = case when col3 = 'abc' then @true else @false end, col4 
from <tablename> where <some condition> 

この場合はおそらく行き過ぎ、多分便利なあなたのSQLは複数文であり、あなたは、変数を複数回参照します。

1

ブールのための右の文字列の値が「真」と「偽」であるので、あなたのクエリに使用します。

Select col1, col2, isActive = case when col3 = 'abc' then 'True' else 'False' end, col4 
from <tablename> where <some condition>