2016-09-28 5 views
0

Я пытаюсь уменьшить размер моего SQL where заявление, чтобы устранить избыточные положения «удалить union заявленияУсловный где оператор и оператор сравнения

Мое заявление, как это:.

SELECT 
    col1, col2, col3...etc 
FROM 
    someTabe 
WHERE 
    col1 = :param 
    and :sType = 1 
UNION 
SELECT 
    col1, col2, col3...etc 
FROM 
    someTabe 
WHERE 
    col1 like '%'||:param||'%' 
    and :sType = 2 

Проблема с этим утверждением заключается в том, что для каждой возможности :sType я должен написать инструкцию select и объединить все возможности, и в моем случае мои SQL-запросы очень длинные и сложные даже без объединения

Так что я попытался переписать где о чем-то вроде этого:

SELECT 
    col1, col2, col3...etc 
FROM 
    someTabe 
WHERE 
    CASE WHEN :sType = 1 then col1= :param ELSE col1 like '%'||:param||'%' END 

Но это не удается бежать, ему нужен оператор после сазе, как в this question

Итак, есть синтаксис, который может достичь идеи в приведенном выше утверждении?

+0

вы не можете просто использовать OR: напр: WHERE (col1 =: пары и: Stype = 1) ИЛИ (col1 как «% пары% 'и sType = 2) ... ?? – Zeina

+1

@ Zeina, я честно не знаю, почему я не думал об OR-заявлении, я обычно стараюсь избегать OR, и я переусердствовал над решением, я думаю, что заслуживаю проголосовать xD – simsim

ответ

2

Простой или может быть достаточно.

SELECT 
    col1, col2, col3...etc 
FROM 
    someTabe 
WHERE 
    (:sType = 1 and col1 = :param) 
or (:sType = 2 and col1 like '%'||:param||'%') 

Пример того, как использовать случай: Conditional WHERE clause with CASE statement in Oracle

+0

Я не знаю, почему Я об этом не думал! – simsim

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