2016-03-24 15 views
0

社内SQLジェネレータを拡張しています。ブール値に対するWHERE述語のブール値比較

このジェネレータはC#で設計されており、LinqクエリからSQLクエリを作成する機能を追加しています。 Linqクエリは、「定数」式(すなわち、SQL生成の前に真/偽/等となる式)を有することができる。例を与えることを

、のようなLINQクエリ:私は実際のブール値を使用していますので、これはSQLに失敗し

SELECT Property FROM ParentObject WHERE true AND Property = OuterProperty

var OuterProperty = *something*; 
ParentObject.Where(
    element => 
    OuterProperty != null && element.Property == OuterProperty 
) 

は次のように煮詰めることができますここで述語。

私の質問は、 このようにブール値のような定数値を使用することはできますか?


では、次のスニペットを試すことができ、これをテストするには:これはあなたの次のエラーを与える

select 1 where IIF(true,1,0) = 1 

An expression of non-boolean type specified in a context where a condition is expected, near '('.

+0

。 –

+0

私は '1 = 1'のようなものを使用しました –

答えて

0

TRUEとFALSEは、SQLには存在しません。

代わりにtrueまたはfalseに評価される式を使用します。

SELECT 'hello' WHERE (1 = 1);  // true: selects 'hello' 
SELECT 'world' WHERE (1 = 0);  // false: selects nothing 

あなたはSQLを自分で生成しているので、それは離れてブールのほとんどを最適化するのは簡単です:私はあなたのコードは、このような「未知の欄 `true`に」とエラーが発生することを期待する

WHERE true AND x ==> WHERE x 
WHERE false AND x ==> remove the whole select 
WHERE false   ==> remove the whole select 
WHERE true OR x ==> no where clause 
WHERE true   ==> no where clause 
WHERE false OR x ==> WHERE x 
+0

私は今この提案を試みます。 – PiMan

関連する問題