如果不是空值,则使用“where”。

4

目标

仅在参数不为空时使用“where”子句。

问题

我不知道语法。

我的内容

以下语法无效。

CREATE DEFINER=`root`@`localhost` PROCEDURE `getProductsListForHome`
(IN `inOffer` INT, IN `categoryId` INT)
BEGIN
    SELECT (MIN(`map`.`Product_Price`)) as `minProductPrice`,
        (MAX(`map`.`Product_Price`)) as `maxProductPrice`,
        `pr`.`Product_Name` as `productName`,
        `ca`.`Category_Name` as `categoryName`
    FROM `bm_market_products` as `map`
    JOIN `bm_products` as `pr` ON `map`.`Product_Id` = `pr`.`Product_Id`
    JOIN `bm_products_category_relationship` as `car` 
    ON `pr`.`Product_Id` = `car`.`Product_Id`
    JOIN `bm_product_categories` as `ca` ON `car`.`Category_Id` = 
    `ca`.`Category_Id`

    WHERE `map`.`Product_State` = inOffer

    IF (`categoryId` != null) THEN
        AND `ca`.`Category_Id` = `categoryId`
    END IF;

    GROUP BY `map`.`Product_Id`;
END

问题出在第19行。

重复的问题?

我不这样认为。我搜索了这个主题,但没有成功——所以我来这里发帖。

细节

我在这里阅读了关于控制流函数的内容,但对我来说仍然很困惑。

提前感谢!

3个回答

3

如果一个字段不为空,则希望获取与该谓词匹配的记录。这就像是说如果字段为空,则获取它们,否则进行过滤。只需要使用OR将两个谓词组合即可:

AND (`categoryId` IS NULL OR `ca`.`Category_Id` = `categoryId`)

2
你可以删除所有那些不必要的反引号(顺便加一) - Bohemian
哦,感谢您的答案!对我非常有用!+1/采纳!@Bohemian 我认为使用反引号代码更加有组织。 - Guilherme Oderdenge

1

如何使用 coalesce 函数?

WHERE `map`.`Product_State` = inOffer

  AND `ca`.`Category_Id` = coalesce(categoryId,`ca`.`Category_Id`)

0
WHERE ...
AND (ca.Category_Id = categoryId OR categoryId IS NULL)
...

或者(仅供教育目的):

WHERE ...
AND IF(categoryId IS NULL, TRUE, ca.Category_Id = categoryId)

但不要这样做...

顺便说一下,您使用的表单是 "控制流程语句",用于控制过程中的执行流程。我提出的形式(在第二个不应使用的选项中)是 "控制流程函数"(本质上是一个函数调用)。

第一种形式与所有命令式语言相同。第二种形式是为在SQL语句中使用而设计的。后者只应在最后一种情况下使用,因为几乎总有更好的方法来编写查询。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接