• ベストアンサー

空白も連結したい、あるいは複雑な条件分岐

テーブル「虫」に フィールド「アリ」「ハチ」「チョウ」があります。 それぞれint型です。 ここで1,0,2とデータがある時 「蟻1匹、蝶2匹」というような結果を返したいのですが、「蟻1匹、蜂0匹、蝶2匹」のようにしたくありません。 case where アリ>0 then '蟻'||アリ||'匹' else NULL end を使うところまで思い至ったのですが、そこから先どうすれば良いのか悩んでいます。 何かヒントだけでもいただければ幸いです。 よろしくお願いします。

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

  • ベストアンサー
回答No.1

手元に環境がないので確認取れませんが、 (case where アリ>0 then '蟻'||アリ||'匹' else '' end) || (case where ハチ>0 then '蜂'||ハチ||'匹' else '' end) || (case where チョウ>0 then '蝶'||チョウ||'匹' else '' end) as 総数 のように case ~ end を文字連結してみては。できるかどうか試してください。

D_mode
質問者

補足

ごめんなさい!「where」じゃなくて「when」でしたね。確認不足でした。

関連するQ&A

  • caseを使った条件分岐の加算がうまくいかない

    SQLで条件によって加算するか、しないかを判定したいと思っています。 ■テーブル:test name,flag,number mike,4,1 mike,4,2 mike,5,3 mike,6,4 mike,7,5 mike,8,6 mike,9,7 ■書いたSQL SELECT test.name AS "name", (CASE WHEN flag = '4' THEN sum(number) ELSE NULL END) AS "4", (CASE WHEN flag = '5' THEN sum(number) ELSE NULL END) AS "5", (CASE WHEN flag = '6' THEN sum(number) ELSE NULL END) AS "6", (CASE WHEN flag = '7' THEN sum(number) ELSE NULL END) AS "7", (CASE WHEN flag = '8' THEN sum(number) ELSE NULL END) AS "8", (CASE WHEN flag = '9' THEN sum(number) ELSE NULL END) AS "9" FROM test GROUP BY test.name ■結果 4,5,6,7,8,9 null,null,null,null,null,28 欲しい結果は、フラグが4ののものの合計。flagが「4」の場合は、「3」という結果が返ってきてもらいたいです。 flagが5の場合は、3が返ってきてもらいたいです。 SQLが間違っているのですが、どこが間違っているのかわかりません。どのように修正すればよろしいでしょうか?よろしくお願いします。 環境はSQLiteを使用しています。

  • 特定条件で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 ご教授の程、よろしくお願い致します

  • 条件分岐 case文での文字列の連結方法

    SELECT CASE WHEN 項目1 = 1 THEN '月' END+ CASE WHEN 項目1 = 2 THEN '火' END+ CASE WHEN 項目1 = 3 THEN '水' END AS 曜日 FROM テーブル1 として、文字列を「月火水」と続けたいのですが、NULLが表示され上手く行きません。 解決方法をご教示お願い致します。

  • NULLを含むフィールド値の条件分岐

    どなたかご存知の方はご教示願います。 使用言語はVB6_SP5、DBはMdb(アクセス97形式)です。 ADOでDBに接続し、レコードセットを取得しそのレコードの任意のフィールドの値により処理を3通りに分けたいのです。(値はNULL、"1"、"9" の3つです。) IF文で条件分岐を行いたいのですが、うまく振り分けができずにおります。 IF ISNULL(RS.FIELDS("HHH").VALUE) THEN NULLの場合の処理 ELSE "1"の場合の処理 END IF ' "9" の場合はなにもしない 結果は全てNULLの場合の処理を実行してしまいます。 どこを修正すれば宜しいのでしょうか?

  • ストアドプロシージャの条件分岐に関して

    お世話になります。 以下の環境で開発を行っています。 言語:C#(.NET 2008) DB: SQL Server 2008 C#で作成した画面にて入力された値をパラメータで ストアドプロシージャに渡し、その値がNULLでない場合だけ WHERE句にレコード絞り込み条件を与えるSQL文を 考えているのですが、記述方法がわかりません。 (プロシージャ) --------------------------------------------- DECLARE @param1 = ''  -- 画面から渡されるパラメータ1 @param2 = ''   -- 画面から渡されるパラメータ2 SELECT * FROM TABLE1 A, TABLE2 B    -- (1) IF @param1 IS NOT NULL AND @param2 IS NOT NULL    -- ここから WHERE A.COLUMN1 = @param1 AND A.COLUMN2 = @param2 ELSE IF @param1 IS NOT NULL AND @param2 IS NULL WHERE A.COLUMN1 = @param1 ELSE IF @param1 IS NULL AND @param2 IS NOT NULL WHERE A.COLUMN2 = @param2              -- ここまで (2) AND A.COLUMN1 = B.COLUMN1       -- (3) AND A.COLUMN2 = B.COLUMN2      -- (4)   ------------------------------------------------ 上記の(1)から(4)までをうまく1つにまとめたかたちで記述することができません。 特に上記(2)の効率のよい正しい記述方法がわかりません。 どなたかご教授願えますか? よろしくお願いいたします。

  • 複数JOINしているとCOUNTが正しく取得できな

    LAMP環境で開発をしています。 SQL文でCOUNTを求める際に、まとめて結果を求めようとして上手く行きません。 状況としては以下です。 テーブルdはidをkeyにa,b,c3つのテーブルとjoinしています。 id = 1の場合、テーブルa,b,cにマッチするレコードがそれぞれに4個、1個、0個あります。 ひとつひとつを SELECT COUNT(CASE WHEN a.name IS null THEN 1 ELSE null END) as a_count FROM d INNER JOIN a ON a.id = d.id WHERE d.id = 1 として結果を求めると4,1,0と出るのですが、まとめて SELECT COUNT(CASE WHEN a.name IS null THEN 1 ELSE null END) as a_count, COUNT(CASE WHEN b.name IS null THEN 1 ELSE null END) as b_count, COUNT(CASE WHEN c.name IS null THEN 1 ELSE null END) as c_count FROM d INNER JOIN a ON a.id = d.id INNER JOIN b ON b.id = d.id INNER JOIN c ON c.id = d.id WHERE d.id = 1 とすると28,5,0という値が返されます。 どのように書けば正しい4,1,0を得られるのでしょうか? よろしくお願いします。

    • ベストアンサー
    • MySQL
  • 蜂(ハチ)と、蟻(アリ)は、関係があるのですか?

    ハチとの関係 Wiki >一般認識としてハチとアリは区別されている。これは日本のアリの多くが毒針を持たないこと、生殖目的以外では翅を持たずに地面で生活することから区別されたと考えられる。しかし、実際にはスズメバチやベッコウバチに近縁なグループで、アリ科の動物は全てハチそのものである。スズメバチ側から見ても、ミツバチよりアリ類の方が近縁である。実際に、アリバチなど翅を失ったハチはアリと良く似ており、羽アリはハチと区別が難しい。 → というわけで、蜂(ハチ)と、蟻(アリ)は、関係があるのですか? アリと、ハチは、同じ仲間なのですか?

  • 同じ構成のテーブルの条件付き結合

    同じ構成のテーブルがテーブル1~テーブル6まであり、6つのテーブルを集計するSQLを作成しています。 カラムは ID、名前、日付1、日付2、ステータス1、ステータス2 です。 IDがプライマリーキーになっており、テーブル1にしかないIDや全てのテーブルに登録されているIDなどもあり、IDの一覧を作成したいです。 IDが重複していた場合、名前はどれを残しても構わないのですが(どのテーブルか指定する必要があるのならばとりあえずテーブル番号が若い方の名前を残すようにしてください。) 日付1は最古の日付 日付2は最新の日付 ステータスは共に優先順位が1>2>0>nullとなっており優先順位が高いほうを残すようにし、ステータスが両方nullの場合は集計しないようにしたいです。 テーブル1 ID、名前、日付1、日付2、ステータス1、ステータス2 111、あああ、2001/1/1、2001/1/1、2、2 222、いいい、2001/1/1、2001/1/1、2、2 333、ううう、2001/1/1、2001/1/1、null、null 555、おおお、2001/1/1、2001/1/1、2、2 テーブル2 ID、名前、日付1、日付2、ステータス1、ステータス2 111、aaa、2002/2/2、2002/2/2、0、null 222、iii、2002/2/2、2002/2/2、1、0 333、uuu、2002/2/2、2002/2/2、null、null 444、eee、2002/2/2、2002/2/2、1、1 結果 ID、名前、日付1、日付2、ステータス1、ステータス2 111、あああ、2001/1/1、2002/2/2、2、2 222、いいい、2001/1/1、2002/2/2、1、2 444、eee、2002/2/2、2002/2/2、1、1 555、おおお、2001/1/1、2001/1/1、2、2 このようなことを6つのテーブルを集計して行いたいです。 SELECT t1.id,MIN(t1.日付1)as 日付1,MAX(t1.日付2)as 日付2,CASE When t1.ステータス1="1" then "1" else t1.ステータス1 end ,CASE When t1.ステータス2="1" then "1" else t1.ステータス2 end FROM( SELECT * FROM テーブル1 UNION All SELECT * FROM テーブル2 UNION All SELECT * FROM テーブル3 UNION All SELECT * FROM テーブル4 UNION All SELECT * FROM テーブル5 UNION All SELECT * FROM テーブル6 )as t1 WHERE NOT(t1.ステータス1 IS null AND t1.ステータス2 IS null) GROUP BY id 日付は出来ていると思うのですが、ステータスで1の優先がまだ出来ていないので修正お願いいたします。

    • ベストアンサー
    • MySQL
  • 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の構文エラー

    いつもお世話になってます。 現在、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)あああ'の構文エラー:演算子がありません。