如何在Where语句Oracle SQL中使用CASE?

时间:2014-10-14 14:39:43

标签: sql

我有一个简单的SQL语句来返回产品数据。基本上我可以输入项目的名称,如果项目匹配完全,那么什么都不做,如果没有匹配的确切请求我想在我的SQL中切换'WHERE'语句。目前它看起来像:

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

这显然只会返回名为“iPhone”的产品。 iPhone 5不会被退回。

我想要做的是如果查询使用第一个Where子句获取0行,那么它会触发第二个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'

但是无法解决如何在WHERE上进行切换案例,以说明:

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%'
} 

我是如何实现这一目标的?

1 个答案:

答案 0 :(得分: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')
       );