case文、in句を使ったSQLについて□やりたいこと

Writer: admin Type: duanmo Date: 2019-03-06 00:00
case文、in句を使ったSQLについて□やりたいこと フルーツテーブル(id,nameを持つ)があり県名によって取得するフルーツid、フルーツ名が異なる。県名をバインド変数に入れてフルーツ情報を取得したい。□作ってみたSQL select id, namefrom フルーツテーブルwhere id incase when %1='岡山' THEN q'[('peach','muscat')]'when %1='山梨' THEN q'[('peach','grape')]'岡山だったらpeachとmuscatとそれぞれの名前、山梨だったらpeachとgrapeとそれぞれの名前を取得したい。上記Sqlでエラーはでないものの検索結果0件となってしまう。□質問上記のようなことをやりたい場合どういったSQLで取得することができるでしょうか?そもそもcase文にin句は使えないのでしょうか?共感した0###> そもそもcase文にin句は使えないのでしょうか?そもそもSQLのCASEは式です、文ではありません。式である以上値を返さなければなりません。SQLの構文を書き換えるわけではないです。CASE式が「行値」を返せるかどうかはRDBMSによるかもしれませんが。IN述語の対象になる値リストは返すことは出来ません。> SELECT id, name> FROM フルーツテーブル> WHERE id IN> CASE WHEN %1='岡山' THEN q'[('peach','muscat')]'> WHEN %1='山梨' THEN q'[('peach','grape')]'「%1」がバインド変数ということは元になるプログラミング言語とインターフェイスがあると思いますが、「q'[('peach','muscat')]'」ろいう表現はSQL自体のものではないですね。無理やり書かれているような条件をORACLEのSQLに記述するならSELECT id, nameFROM フルーツテーブルWHERE id IN( SELECT 'peach' FROM DUAL WHERE %1 = '岡山' UNION ALL SELECT 'muscat' WHERE %1 = '岡山' FROM DUAL UNION ALL SELECT 'peach' WHERE %1 = '山梨' FROM DUAL UNION ALL SELECT 'grape' WHERE %1 = '山梨' FROM DUAL );とかになるでしょう。SELECT id, nameFROM フルーツテーブルWHERE id IN( SELECT id FROM (SELECT '岡山' area, 'peach' id FROM DUALUNION '岡山', 'muscat' FROM DUALUNION ALL SELECT '山梨', 'peach' FROM DUALUNION ALL SELECT '山梨', 'grape'' WHERE FROM DUAL ) qWHERE area = %1 )でも。ただこうすると抽出する県の特産品は2つしか持てませんし値も固定です。要件が変わるとこの部分のソース記述を変更しなければなりません。私ならせめて「特産品」テーブルをデータベースに追加しますね。特産品(都道府県, 特産品)ナイス0
###この回答は投票によってベストアンサーに選ばれました!

 

TAG