2014-10-14 2 views
2

У меня есть простая инструкция SQL для возврата данных продукта. В принципе, я могу ввести имя элемента, если элемент точно соответствует, а затем ничего не делать, если нет совпадений для точного запроса, я хочу переключить оператор «WHERE» в моем SQL. В настоящее время это выглядит так:Как использовать CASE in Где состояние Oracle SQL?

SELECT 
    Product_ID, 
    Product_Name, 
    Product_Type, 
    Product_Cost 
FROM tblProducts 
WHERE Product_Name = 'iPhone' 

Это, очевидно, будет точно возвращать продукты под названием «iPhone». iPhone 5 не будет возвращен.

То, что я пытаюсь сделать, если запрос выбирает 0 строк, используя первое Where положение, то он запускает вторую where положения, которое было бы что-то вроде:

WHERE Product_Name like '%iPhone%' 

Так что, если нет продуктов называемый точно iPhone, возвращать любые продукты, у которых iPhone есть где-то на свое имя.

Я хочу, чтобы отобразить это на панели результатов запроса, поэтому, пытаясь создать дополнительное поле на выходе, это своего рода флаг, чтобы сказать «если второе предложение Where использовало заданное значение в 1». Где 1 = нет точного соответствия, 0 = точный спичка

Так я бы в конечном итоге с чем-то вроде:

ID  Name   Type  Cost Matched 
-----------------------------------------------  
101| New iPhone Case| Electronics | 4.99 | 1 

До сих пор у меня есть:

SELECT 
    Product_ID, 
    Product_Name, 
    Product_Type, 
    Product_Cost 
CAST(0 AS VARCHAR2(1)) as match 
FROM tblProducts 
WHERE Product_Name = 'iPhone' 

Но не могу работать, как сделайте случай переключателя на ГДЕ, чтобы проиллюстрировать:

SELECT 
    Product_ID, 
    Product_Name, 
    Product_Type, 
    Product_Cost 
CAST(0 AS VARCHAR2(1)) as match 
FROM tblProducts 
WHERE Product_Name = 'iPhone' 
if (results = 0){ 
SELECT 
    Product_ID, 
    Product_Name, 
    Product_Type, 
    Product_Cost 
CAST(1 AS VARCHAR2(1)) as match 
FROM tblProducts 
WHERE Product_Name like '%iPhone%' 
} 

Любые идеи о том, как я мог бы достичь его?

ответ

2

Я не вижу, как это можно сделать с помощью инструкции case (не в разделе where, как минимум).

Запрос производить без точных соответствий будет довольно прямолинейно:

SELECT Product_ID, 
     Product_Name, 
     Product_Type, 
     Product_Cost 
     CASE Product_Name WHEN `iPhone` THEN 0 ELSE 1 END AS Match 
FROM tblProducts 
WHERE Product_Name LIKE '%iPhone%' 

Хитрость, чтобы вернуться, не точное совпадение только если точные совпадения не существует. Это можно сделать с помощью оператора not exists:

SELECT Product_ID, 
     Product_Name, 
     Product_Type, 
     Product_Cost 
     CASE Product_Name WHEN `iPhone` THEN 0 ELSE 1 END AS Match 
FROM tblProducts 
WHERE Product_Name = 'iPhone' OR 
     (Product_Name LIKE '%iPhone%' AND 
     NOT EXISTS (SELECT * 
        FROM tblProducts 
        WHERE Product_Name = 'iPhone') 
     );