2016-04-15 4 views
0

Я просмотрел некоторые из вопросов, заданных уже по этому вопросу, но никто не ответил на мои вопросы.sql - проблемы с условным предложением WHERE с оператором CASE

У меня есть таблица, где столбец может содержать цифры и аннулирует

В зависимости от ид я представляемого в моей хранимой процедуре, я либо должен выбрать, где идентификаторы равны нулю или совпадают идентификатор или все из них.

Вот что у меня есть, но оно не работает.

pi_region_id = 51 означает, что мне нужно все hrcc_id = нуль

pi_region_id не 51 или 52, то hrcc_id = pi_region_id

еще (это означает, что это 52), вернуть им все

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 дает мне «ORA-00905: недостающее ключевое слово» с ошибкой, кажущейся на i.hrcc_id IS NULL.

Я все еще очень новичок в pl/sql, поэтому любая помощь будет принята с благодарностью.

Спасибо!

UPDATE

Пример из моих таблиц

ПОКАЗАТЕЛИ

INDICATOR_ID | INDICATOR_NAME_EN | HRCC_ID

1 | Что-то | (null)

2 | Другое | 1

3 | Снова | 2

HRCC

HRCC_ID | REGION_CODE

1 | QC

2 | ON

(извините ... не мог заставить его выглядеть лучше)

Что мне нужно, когда:

pi_region_id = 51, чтобы вернуть только те строки, в которых ПОКАЗАТЕЛЕЙ HRCC_ID IS NULL

pi_region_id = 52 для возврата Eveything

pi_region_id = 1, например, для возврата строк на INICATORS где HRCC_ID = 1

ответ

1

несколько замечаний: Не убедитесь, что вам нужен PL/SQL, это похоже на то, что вы должны делать в стандартном SQL. В операторе CASE вы использовали: = в одном месте, которое является оператором присваивания PL/SQL, - где вы, вероятно, хотели проверить на равенство.Наконец, вы не должны конструкции CASE - ваш ИНЕКЕ можно сказать так:

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

Пояснения: если pi_region_id = 52, то первое условие истинно, поэтому все строки возвращаются. В противном случае, если pi_region_id = 51 или! = 51, верните строки в соответствии с вашим правилом. Скобки не нужны (приоритет AND над OR), но они помогают с удобочитаемостью.

Удачи вам!

+0

Благодарим вас за ответ. Это почти работает. Единственное условие, которое не работает, второе - «(pi_region_id = 51 и i.hrcc_id равно null)», когда я добавляю 51 для входного параметра pi_region_id, он должен возвращать 6 строк, но не возвращает никаких. – Karinne

+0

Тогда в других частях запроса должны быть проблемы. Если вы можете показать репрезентативную выборку своих таблиц, мы можем устранить ее. – mathguy

+0

Например: некоторые hrcc_id могут быть отклонены условием соединения, прежде чем вы перейдете к предложению where. – mathguy

Смежные вопросы