Как сделать условное где в sql?

У меня есть таблица, которую я не могу изменить, которая имеет следующую структуру

request_table

ID   PROCESS_ID   STATUS      DATE
1        1           -1       2002
2        2            1       2003
3        2            4       2004
4        3            5       2005
5        3            14      2005
6        1            15      2006

а process_id является ключом к proccess_table который

process_id    process_name
   1               a
   2               b        
   3               c 

и у меня есть входной параметр: processID

что я хочу

if the paramter  = 5 

then return records that have STATUS 14 or 15 only

else
  if 
the paramter is null 
then return all records

else if the paramter has any value except 5 , apply this condition

where :processID = requests_table.PROCESS_ID   

как этого добиться? Я не могу вставить новые записи в таблицы

где (параметр = 5 и СТАТУС в (14, 15)) или (параметр <> 5 и: ID процесса = requests_table.PROCESS ID)

jarlh 13.09.2018 19:31

Также см. docs.oracle.com/cd/B19306_01/server.102/b14200/…

njras 13.09.2018 19:33
0
2
54
3

Ответы 3

вы можете использовать EXECUTE IMMEDIATE Query определите переменную varchar и установите в нее свой запрос, после чего проверьте свои параметры и установите параметры вашего запроса посмотрите на этот пример:

declare   
  myQuery   varchar(500) ;   
  parameter number := 5;   
begin   
  myQuery := ' select * from requests_table ';   

  if parameter = 5 then   
    myQuery := myQuery || ' where (status=14 OR status=15) ' ;   
  end if;    

  EXECUTE IMMEDIATE myQuery;   
end;    
end;    

параметр - это ваше значение, которое вы хотите передать ему

Я бы предложил использовать все, что вызывает SQL (например, PHP), для переключения между различными операторами SQL, например

if(processID==5){
    query="SELECT * FROM requests_table WHERE STATUS=14 OR STATUS=15"
} else if (processID==null){
    query="SELECT * FROM requests_table"
} else {
    query="SELECT * FROM requests_table WHERE PROCESS_ID=processID"
}

а затем запустите выбранный запрос.

если вы хотите, чтобы все это было в одном операторе SQL, вы можете сделать

SELECT * FROM requests_table WHERE (processID=5 AND (STATUS=14 OR STATUS=15)) OR processID NULL OR PROCESS_ID=processID

Вы можете сделать это одним оператором как:

SELECT *
FROM requests_table
WHERE (:processID = 5 AND STATUS IN (14, 15)) OR
      (:processID = processId) OR
      (:processID IS NULL);

Другие вопросы по теме