我有一个简单的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%'
}
我是如何实现这一目标的?
答案 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')
);