特定条件でWHERE句の条件を変更したい

このQ&Aのポイント
  • 特定条件を満たす場合にWHERE句の条件を動的に変更する方法について質問しています。
  • 現在は文字列の組み合わせで条件を作成し、動的にSQL文を生成していますが、直接SQLの中で条件を指定したいと考えています。
  • 具体的なSQL文の例として、CASE文を使用して条件分岐している場合にどのように書けばよいか教えていただきたいです。
回答を見る
  • ベストアンサー

特定条件でWHERE句の条件を変更したい

@jouken int @sql varchar(MAX) @select varchar(MAX) @where varchar(MAX) set @select = 'select * from table1' set @where = ' where case when @jouken = 0 then 'field1 = 1' when @jouken = 1 then 'field1 = 1 or field2 = 1' when @jouken = 2 then 'field1 = 1 or field2 = 1 or field3 = 1' end ' set @sql=@select+@where exec(@sql) 上記のような文字列の組み合わせでの作成でやりたいことはできたのですが、 こちらを直接SQLの中でやりたいのです。 以下の文は機能しません。 select * from table1 where case when @jouken = 0 then field1 = 1 when @jouken = 1 then field1 = 1 or field2 = 1 when @jouken = 2 then field1 = 1 or field2 = 1 or field3 = 1 end ご教授の程、よろしくお願い致します

質問者が選んだベストアンサー

  • ベストアンサー
  • todo36
  • ベストアンサー率58% (728/1234)
回答No.1

andとorで記述できます。 select * from table1 where @jouken = 0 and field1 = 1 or @jouken = 1 and (field1 = 1 or field2 = 1) or @jouken = 2 and (field1 = 1 or field2 = 1 or field3 = 1)

boooone
質問者

お礼

todo36様 ありがとうございました! バッチリです。 これから使わせて頂きます。

関連するQ&A

  • WHERE句でのCASEについて

    WHERE句でのCASEの使い方についてご教授下さい。 以下の3分岐でSELECTしようとしています。 項目A=1なら、 項目B / 1000=10 のデータを。 項目A=2なら、 項目C=C のデータを。 項目A=3なら、 項目B / 1000=10 かつ項目D=D のデータを。 ※しばらくPCに触れないので確認不可ですが以下は試みたい方法です。 ただ心配なのは、例えば項目A=1のときに項目B / 1000 = 10を満たすデータと満たさないデータが存在する場合、 満たすデータまでもが抽出されないのではという心配があります。 SELECT * FROM テーブル WHERE 1 = CASE WHEN 項目A=1 THEN CASE WHEN 項目B / 1000 = 10 THEN 1 ELSE END WHEN 項目A=2 THEN CASE WHEN 項目C = C THEN 1 ELSE END WHEN 項目A=3 THEN CASE WHEN 項目B / 1000 = 10 AND 項目D = D THEN 1 ELSE END ELSE END

  • 【Transact-sql】 execの結果をoutputパラメータに持たせたい

    タイトルの通り、execの結果をoutputパラメータに持たせたいのですが、 どうすればご存知の方、ご教授お願いします。以下のように、count(*)の結果を持たせたいです。以下にサンプルコードを記載しました。 ---ストアドabc--- ( @aWork int output, @bWork int output, @cWork int output, @IDs varchar ) declare @Sql1 varchar(500) declare @Sql2 varchar(500) declare @Sql3 varchar(500) declare @IDs varchar(500) set = '1,2,3' set @Sql1 = 'select count(*) from a where id = ' + IDs -- @aWork = exec(@Sql1)としたい exec(@Sql1) set @Sql2 = 'select count(*) from b where id = ' + IDs -- @bWork = exec(@Sql2)としたい exec(@Sql2) set @Sql3 = 'select count(*) from c where id = ' + IDs -- @cWork = exec(@Sql3)としたい exec(@Sql3)

  • case構文の条件について

    cseで ------------------------------- SELECT a,b, CASE c WHEN 1 THEN "○" WHEN 0 THEN "×" END from A ; ------------------------------- というSQL文を実行すると カラムa,bには値が入っていますが カラムcは空欄になってしまいます。 CASE構文のところを、 ------------------------------- CASE c WHEN 1 THEN 1 WHEN 0 THEN "×" END ------------------------------- とするとカラムcの取得結果は、 1 × になります。 どうやら、THENを両方全角文字にすると空欄に なるようです。 ちなみにカラムcは"tinyint(1)"です。 "varchar(10)"にしても取得結果は 同じになってしまいます。 なぜこうなるのか、また、 どうやったら"○×"に限らず全角文字を 条件に出来るか教えてください。

  • 変数の取り扱いについて

    はじめまして。思いっきりSQLSERVERは初心者なんですが宜しくお願いします。 現在SQLSERVER2005です。 ややこしくなるので要点だけ以下まとめています。 変数を利用してレコードを抽出する時なんですが… ALTER PROCEDURE Test @Rank INT BEGIN DECLARE @SELECT AS VARCHAR(100) DECLARE @WHERE AS VARCHAR(100) DECLARE @SQL AS VARCHAR(200) SET @SELECT = 'SELECT * FROM tblA ' SET @WHERE = 'WHERE Rank > ' + @Rank SET @SQL = @SELECT + @WHERE EXEC(@SQL) END 実行すると varchar の値 'WHERE Rank > 'をデータ型 int に変換できませんでした。 となります。 Rank部分が数値なんですが、どのように取扱いすべきなんでしょうか。

  • WHERE句の中でCASE句

    区分が1の時にステータス0,1,2のもの、区分が1以外の場合はステータス0,1のものを抽出、というSQLを書きたいのですが、 WHERE句の中に (CASE Kbn WHEN '1' THEN Status in('0','1','2') ELSE Status in('0','1') END) とするとエラーとなりました。 このような場合、WHERE句の中にCASE句で実現は不可能でしょうか? 一応以下のようにすれば期待通りの内容が抽出できるのですが、美しくないなあと。 ((Kbn = '1' AND Status in('0','1','2')) OR (Kbn != '1' AND Status in('0','1'))) 何か他にいい手がありますでしょうか。

  • SQLの構文エラー

    いつもお世話になってます。 現在、VBでSQLを発行し、ACCESSのテーブル(テストデータ)より 値を取得しようとしているのですが、 SQL文の発行時に構文エラーとなってしまいます。 詳細を下記しますので、ご教授頂けたらと思います。 宜しくお願い致します。 【SQL文】 select フィールド1,フィールド2,フィールド3,フィールド4,フィールド5,フィールド6,フィールド7, (CASE WHEN フィールド8='4' or フィールド8='5' then フィールド9*-1 else フィールド9 end)あああ, (CASE WHEN フィールド8='4' or フィールド8='5' then フィールド10*-1 else フィールド10 end)いいい from テストデータ ※フィールド9、フィールド10は数値型、その他はテキスト型です。 実行時エラー'3075' クエリ式'(CASE WHEN フィールド8='4' or フィールド8='5' then フィールド9*-1 else フィールド9 end)あああ'の構文エラー:演算子がありません。

  • SQL分のWHERE句について

    SQLのWHERE句について ================================== ABC :入力値(2又は5バイトの可変) T.テーブル.フィールド:ABCが格納されているテーブル(格納すると同時に5桁になります。) 例:01(入力値)⇒01000(格納値) ================================== 参照時のWHERE句の作成の仕方を教えてください。 ※検索値が2桁の場合は、格納値5桁の前方2桁一致でHITさせます。  また5桁の場合は、格納値5桁の全一致です。 今考えているのでは、 IF ABC <> "" THEN IF LenB(ABC) = 2 THEN SQL_WHERE = SQL_WHERE & "AND (LEFT(T.テーブル.フィールド,2) = '" & ABC & "' )" ELSEIF SQL_WHERE = SQL_WHERE & "AND (T.テーブル.フィールド = '" & ABC & "')" END IF END IF です。 宜しくお願いします

  • 別名フィールドの型を指定

    例えば以下のようなSQL文からビューを作成した場合 SELECT CASE WHEN start_date IS NULL THEN '2010-01-01' WHEN start_date = '0000-00-00' THEN '2010-01-01' ELSE start_date END AS end_date FROM table_a start_dateフィールドはdate型ですが、別名が設定されるend_dateはvarchar型になってしまいます。 これをdate型にしてビューを作成する方法はありませんでしょうか。

  • WHERE句の?

    お世話になります よろしくお願いします。 さっそくで申し訳ないのですが SQL分で SELECT test01 FROM test WHERE test01 = ? の「?」というのはどういう意味があるのでしょうか? 以上よろしくお願いします。

    • ベストアンサー
    • MySQL
  • where句のlikeと=の違いについて

    Postgresバージョン7.1.1からバージョン7.4.6にしたところ困ったことがあります。 テーブル名: hoge カラム名: col (←varchar(12)) データの中身はまるっきり同じ物が入っています。 という環境です。 そこで、SQLを実行するとバージョンによって結果が異なり不可解なのです。何か分かることがありましたら返事をお願いします。 [実行したSQL] select col from hoge where col = 'コル' select col from hoge where col like 'コル' [7.1.1] 共に、答えは一つだけ'コル'が表示されます。 [7.4.6] likeの時は'コル'が一つだけ表示されます。 =の時は何十個か出てきます。 以上、宜しくお願い致します。