現在mysqlでデータ取得のコードを書いています。
質問があるのですが、
結論からいうと、
case文で条件に一致したら複数項目を取得するにはどのうようにすればいいでしょうか?
具体的な状況は次のとおりです。
料理テーブルに「食べ物フラグ」カラムがあり、1だと「野菜」、2だと「フルーツ」「お菓子」カラムを取得します。
そこでcase文を使って書こうとしているのですが、複数取得の方法がわかりません。
select
case 食べ物フラグ
when '1' then 野菜
when '2' then フルーツ,お菓子
else null
end
from 料理テーブル
のような書き方はできますでしょうか?
もしできないようであれば他の方法を教えていただけると助かります。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答6件
0
すでにベストアンサーが出てますが
UNION ALLで1レコードごとに取得して
表示側で縦でも横でも好きなように表示できるようにしたらいいんじゃないでしょうか?
SQL
1SELECT 野菜 2FROM 料理テーブル 3WHERE 取得条件 4AND 野菜フラグ = 1 5UNION ALL 6SELECT フルーツ 7FROM 料理テーブル 8WHERE 取得条件 9AND 野菜フラグ = 2 10UNION ALL 11SELECT お菓子 12FROM 料理テーブル 13WHERE 取得条件 14AND 野菜フラグ = 2 15
投稿2016/08/02 05:10
総合スコア985
0
ネタ系SQLとすればこのあたりだね
sql
1SELECT 2 (CASE WHEN 食べ物 = 1 THEN 野菜 3 WHEN 食べ物 = 2 THEN 果物 4 ELSE NULL END) AS ITEM_1, 5 (CASE WHEN 食べ物 = 2 THEN 菓子 6 ELSE NULL END) AS ITEM_2 7FROM 8 テーブル名 9WHERE 10 条件式
投稿2016/08/01 12:54
総合スコア610
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
回答出揃ってるので蛇足ですが…
提示されてるようなSQLは記載不可なのでいくつかの代替案で対処する必要があります。
###代替案について
要件次第で、
以下のアプローチのうちいずれかを取る形になるのかなと思います。
①CASE式内でCOALESCEを用いる
②結果の文字列を結合して取得する
③取得カラムを明示的に分ける
①が採用できる前提条件は、
- どちらか一方の値だけが出力されることが許容できること(フルーツとお菓子は背反で取得される)
- どちらか一方が優先出力されるのが許容できること(どちらも値がある場合は片方が優先取得される)
③が採用できる条件は、
- 出力結果としてカラムが増えることが許容できること(個人的には結果を混ぜるよりはカラムは分けてた方がメンテしやすい気はします)
出力の仕方は区分値に該当するなら登録値、なければNULLとか空文字とか…
②については上記2つの選択肢が取れない場合に採用する手段かなと思います。
コードは他の方の分で出揃ってるかなと思いますので当方からの掲示は割愛します。
###おまけの話
上記のようなシチュエーションは、
1度限りとかであれば特殊要件なので、あまり心配しなくて良いかと思いますので以下読み飛ばしてください。
ですが万一同じような処理が、
色々な機能で必要となるんですよという状況であれば、テーブル構造の見直しが一番の最適解になることもあり得ます。
SQLやPGでごちゃごちゃしなければな
らないケースというのは、
テーブル構造の歪みに起因することもしばしばです。
やりたいこととして提示していただいてるサンプルを見る限り、
フルーツとお菓子の区別がテーブル保存時に消えてしまっているように見受けられます。
データベースとのやりとりの複雑度は、
こういった情報の欠落が起これば起こるほど飛躍的に上がるものなので、
もし今回のような処理ケースが今後も出てくる、あるいは既に散在しているのでしたら、テーブル定義の見直しを進言しても良いかもしれません。
個人的には食べ物区分は種別ごとに一意に振られ、
でもフルーツとお菓子どっちも取ってこないいけないよという要件があるなら、
もう一個それを示すフラグとか区分なりを追加する方が後々すっきりするかなとも思ってます。
###補足
CASE式について補足。
THEN句の後の値のデータ型が一致することが要求されます。
以下は文字列の場合
SQL
1CASE col1 2 WHEN '1' THEN '文字列1' 3 WHEN '2' THEN '文字列2' -- 一つ目文字なら2つ目も文字で統一 4 ELSE NULL -- ただしNULLはOK 5END
以下は数値
SQL
1CASE col1 2 WHEN '1' THEN 100 3 WHEN '2' THEN 5 -- 一つ目数値なら2つ目も数値で統一 4 ELSE NULL -- ただしNULLは(ry 5END
投稿2016/08/01 12:16
編集2016/08/01 12:42総合スコア1636
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
ベストアンサー
まず命題のSQLは不可能です
代替案として
SQL
1create table 料理テーブル(id int not null primary key,野菜 varchar(20) null,フルーツ varchar(20) null,お菓子 varchar(20) null,食べ物フラグ tinyint); 2insert into 料理テーブル values(1,'にんじん',null,null,1),(2,'じゃがいも',null,'じゃがりこ',1),(3,'きゅうり','きゅうり',null,2),(4,null,null,'きのこの山',2),(5,null,'バナナ','バナナ',2),(6,null,null,null,0);
に対して複数項目を得るときにはCONCATでひろうとか
SQL
1select 2case 食べ物フラグ 3when 1 then 野菜 4when 2 then CONCAT(COALESCE(フルーツ,''),',',COALESCE(お菓子,'')) 5else null 6end AS 食べ物 7from 料理テーブル;
しかしこれだとどちらかにしかデータがない場合中途半端なカンマがつくので
気持ち悪い、たとえばどちらか取ればいいなら
SQL
1select 2case 食べ物フラグ 3when 1 then 野菜 4when 2 then COALESCE(フルーツ,お菓子) 5else null 6end AS 食べ物 7from 料理テーブル;
もしくは視点を変えてカラムは表示するけどNULLにするとか
SQL
1select if(食べ物フラグ=1,野菜,null) AS 野菜 2,if(食べ物フラグ=2,フルーツ,null) AS フルーツ 3,if(食べ物フラグ=2,お菓子,null) AS お菓子 4,食べ物フラグ 5from 料理テーブル;
投稿2016/08/01 11:11
総合スコア117605
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
MySQL
1select 2case 食べ物フラグ 3when '1' then 野菜 4when '2' then concat(ifnull(フルーツ, ''), ifnull(お菓子, '')) 5else null 6end 7from 料理テーブル
こういうことかしら?
投稿2016/08/01 11:08

退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
where で食べ物フラグの条件を指定して、
各々のレコードを取得して
union all したら?
--- 追加 ---
yambejpさんの回答を見てなるほど!って思った。
ちなみに、自分はこんな感じで考えてた。
SQL
1select 野菜 as item1,null as item2 from 料理テーブル where 食べ物フラグ=1 2union all 3select フルーツ as item1,お菓子 as item2 from 料理テーブル where 食べ物フラグ=2
投稿2016/08/01 11:03
編集2016/08/01 11:28総合スコア7466
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。