2016-10-10 3 views
0

を存在する場合:THENとの文は正しくそれを書くためにどのように

declare @p7_ int 
set @p7_=1 
select * from cdn.tranag 
    where 
    case when @p7_=1 then 
    exists(select * from cdn.zrodla join cdn.dziennik on dzk_gidnumer=zro_dtnumer where TrN_GIDTyp=zro_trntyp and TrN_GIDNumer=zro_trnnumer) 
    else -1 end 

感謝。

+3

サンプルテーブルのデータと予想される結果を追加します。 (書式付きテキストも同様です)。使用しているdbmsにタグを付けます。 – jarlh

+1

あなたは何を達成しようとしていますか? –

+0

パラメータが1の場合、存在します。パラメータが0の場合、すべてを表示する – AdiT

答えて

0

SQLのwhere句は何かを何かと比較する必要があります。 @p7_が値1を持っていない限り、「すべてを戻してください」という単純な言い方をしているようです。この場合、レコードが他の場所に存在することを確認してください。これはAND/ORロジックを介して達成することができる

select columns 
from table 
where @p7_ <> 1 
    or (@p7_ = 1 
     and exists(<exists statement>) 
    ) 
0

あなたは、そのようなあなたのwhere句にandorとして使用して簡単な論理演算子を達成することができます。あなたはこの

SELECT * 
FROM cdn.Tranag 
WHERE (@p7_ = 1 
     AND EXISTS(SELECT * 
        FROM cdn.zrodla 
          JOIN cdn.dziennik 
          ON dzk_gidnumer = zro_dtnumer 
        WHERE TrN_GIDTyp = zro_trntyp 
          AND TrN_GIDNumer = zro_trnnumer)) 
     OR @p7_ = 0 
0

を探している

私は、これはあなたが欲しいものだと思う:

select * 
from cdn.tranag t 
where (@p7_= 1 and 
     exists (select 1 
       from cdn.zrodla join 
        cdn.dziennik 
        on dzk_gidnumer = zro_dtnumer 
       where t.TrN_GIDTyp = zro_trntyp and 
        t.TrN_GIDNumer = zro_trnnumer 
      ) 
    ) or 
     (@p7_ <> 1); 

これがあれば@p7_ = 1が、その後exists句がチェックされていることのロジックを実装します。それ以外の場合は、すべての行が選択されます。注:これはNULLをチェックしませんが、追加するのは簡単です。

また、テーブルエイリアスの使用にも注意してください。特にサブクエリを使用している場合、特に複数のテーブルがある場合は、常にテーブルのエイリアスを使用する必要があります。

0

サイド情報のビット:T-SQLで

は、EXISTStrue/false結果にブール式です。しかし、多くの他の言語とは異なり、true/false T-Sqlの「値」は整数値にマップされません。つまり、T-Sql ブール式の結果INTの値として扱うことはできません。 WHERE ...,JOIN ON ...IF ...CASE WHEN ...などのbool句でのみ使用できます。

関連する問題