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 行。

重复的问题?

我不这么认为。我搜索了这个主题,但没有成功——然后我来这里发帖。

细节

我在这里读到了控制流函数,但它仍然让我感到困惑。

提前致谢!

4

3 回答 3

3

因此,如果字段不为 NULL,您希望获取与该谓词匹配的记录。这就像说如果字段为 NULL 则获取它们,否则过滤。只需将两个谓词与OR

AND (`categoryId` IS NULL OR `ca`.`Category_Id` = `categoryId`)
于 2013-06-10T15:42:43.343 回答
1

联合起来怎么样?

WHERE `map`.`Product_State` = inOffer

  AND `ca`.`Category_Id` = coalesce(categoryId,`ca`.`Category_Id`)
于 2013-06-10T15:42:03.743 回答
0
WHERE ...
AND (ca.Category_Id = categoryId OR categoryId IS NULL)
...

或者(仅用于教育目的):

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

但不要这样做...

有关信息,您使用的形式是“控制流语句”,用于控制过程中的执行流。我提出的形式(在第二个不使用的选项中)是“控制流函数”(本质上是函数调用)。

第一种形式与所有命令式语言中的相同。第二个用于在 SQL 语句中使用。后者仅用于最后的手段,因为几乎总是有更好的方法来编写查询。

于 2013-06-10T15:41:06.517 回答