2016-04-15 36 views
0

私はこの主題についてすでに質問された質問のいくつかを見てきましたが、私は答えませんでした。sql - 条件付きWHERE句とCASE文の問題

私は列が、私は私のストアドプロシージャに送信してるのidに応じて、数字やヌル

を保持することができますテーブルを持って、私はどちらかは、IDのは、nullの場所を選択またはID、またはすべてが一致している必要はありそのうちの。

これは私が持っているものですが、動作しません。

私はすべての

SELECT i.indicator_id AS ID, 
     i.indicator_name_en AS name_en, 
     h.region_code 
     FROM indicators i 
     JOIN hrcc h ON h.hrcc_id = i.hrcc_id 
     WHERE (CASE WHEN pi_region_id = 51 THEN i.hrcc_id IS NULL 
        WHEN pi_region_id != 51 OR pi_region_id != 52 THEN i.hrcc_id := pi_region_id 
        ELSE NULL END) 
     ORDER BY i.hrcc_id ASC 

にそれらを返す、すべてのhrcc_id = nullを

pi_region_idが他hrcc_id = pi_region_id

(それは52だという意味)を51か52ではありません必要pi_region_id = 51件の手段オラクルは私に "ORA-00905:missing keyword"を与え、エラーはi.hrcc_id IS NULL上にあるようです。

私はまだpl/sqlの非常に初心者なので、どんな助けでも大歓迎です。

ありがとうございました!私のテーブルの

UPDATE

インジケーター

INDICATOR_ID | INDICATOR_NAME_EN | HRCC_ID

1 |何か| (ヌル)

2 |別の| 1

3 |もう一度| 2

HRCC

HRCC_ID | REGION_CODE

1 | QC

2 |

ON(申し訳ありません...それは良く見てもらうことができませんでした)

私は必要なものときです:

pi_region_id = 51 HRCC_IDがNULL

IS指標の行のみを返すようにpi_region_id = 52 HRCC_ID = 1

答えて

1

INICATORSいくつかの注意事項に行を返すために、例えばeveything

pi_region_id = 1を返す:ありませんなぜPL/SQLが必要なのか、これは標準のSQLでできるはずのようです。 CASE文では、PL/SQLの代入演算子である1つの場所で=を使用しました。おそらく同等かどうかテストしたい場所でした。最後に、あなたは、CASE構文を必要はありません - あなたのWHERE句は次のように述べることができる:

... 
where (pi_region_id = 52) or (pi_region_id = 51 and i.hrcc_id is null) 
    or (pi_region_id != 51 and i.hrcc_id = pi_region_id) 

説明:= 52をpi_region_id場合、最初の条件は、そのすべての行が返されます本当です。それ以外の場合は、pi_region_id = 51または!= 51の場合は、ルールに従って行を戻します。かっこは必要ありません(ORの優先順位)が、可読性に役立ちます。

幸運を祈る!

+0

ありがとうございます。それはほとんど動作します。 "pi_region_id = 51とi.hrcc_idがヌルです"というpi_region_id入力パラメータに51を入力すると、6行が返されますが、何も返されません。 – Karinne

+0

クエリの他の部分に問題があるはずです。テーブルの代表サンプルを表示できる場合は、さらにトラブルシューティングを行うことができます。 – mathguy

+0

例:where句に到達する前に、一部のhrcc_idが結合条件によって拒否されることがあります。 – mathguy