2016-04-15 11 views
0

Ich habe einige der Fragen bereits zu diesem Thema gefragt, aber keine beantwortet meine.sql - Probleme mit bedingten WHERE-Klausel mit CASE-Anweisung

Ich habe eine Tabelle, wo eine Spalte Zahlen halten können und nulls

auf der id Je schicke ich in meiner gespeicherten Prozedur, ich entweder zu wählen, wo die IDs sind null oder passen die ID oder alle von ihnen.

Hier ist, was ich habe, aber es funktioniert nicht.

pi_region_id = 51 bedeutet, ich brauche alle hrcc_id = null

pi_region_id nicht 51 oder 52 ist dann hrcc_id = pi_region_id

andere (was bedeutet, es 52 ist), bringt sie alle

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 

Oracle gib mir ein "ORA-00905: fehlendes Schlüsselwort" mit dem Fehler scheint auf der i.hrcc_id IS NULL zu sein.

Ich bin immer noch sehr Neuling in pl/sql so jede Hilfe würde sehr geschätzt werden.

Vielen Dank!

UPDATE

Beispiel für meine Tabellen

ANZEIGER

INDICATOR_ID | INDICATOR_NAME_DE | HRCC_ID

1 | Etwas (null)

2 | Ein anderes | 1

3 | Wiederum | 2

HRCC

HRCC_ID | REGION_CODE

1 | QC

2 | ON

(sorry ... bekommen konnte es nicht besser aussehen)

Was ich brauche, ist, wenn:

pi_region_id 51 = nur Zeilen in ANZEIGER zurückzukehren, wo HRCC_ID IS NULL

pi_region_id 52 = eveything

pi_region_id = 1 zum Beispiel zurückzukehren, wo zurückzukehren Reihen auf INICATORS HRCC_ID = 1

Antwort

1

einige Anmerkungen: Not Sicher, warum Sie PL/SQL brauchen, scheint dies etwas zu sein, was Sie in Standard-SQL tun können. In der CASE-Anweisung haben Sie Folgendes verwendet: = an einer Stelle, was der PL/SQL-Zuweisungsoperator ist - wo Sie wahrscheinlich auf Gleichheit testen wollten.Schließlich sollten Sie das CASE-Konstrukt nicht brauchen - Ihre WHERE-Klausel kann wie folgt angegeben werden:

... 
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) 

Erläuterung: wenn pi_region_id = 52, die erste Bedingung erfüllt ist, so dass alle Zeilen zurückgegeben werden. Andernfalls, wenn pi_region_id = 51 oder! = 51, geben Sie Zeilen gemäß Ihrer Regel zurück. Die Klammern sind nicht notwendig (Vorrang von AND über OR), aber sie helfen bei der Lesbarkeit.

Viel Glück!

+0

Vielen Dank für Ihre Antwort. Es funktioniert fast. Die einzige Bedingung, die nicht funktioniert, ist die zweite "(pi_region_id = 51 und i.hrcc_id ist null)", wenn ich 51 für den Eingabeparameter pi_region_id setze, sollte es 6 Zeilen zurückgeben, gibt aber keine zurück. – Karinne

+0

Dann muss es Probleme in anderen Teilen der Abfrage geben. Wenn Sie ein repräsentatives Beispiel Ihrer Tabellen anzeigen können, können wir weitere Fehler beheben. – mathguy

+0

Zum Beispiel: einige hrcc_id kann von Ihrer Join-Bedingung abgelehnt werden, bevor Sie jemals die Where-Klausel erhalten. – mathguy