仅当参数不为空时才使用“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行。
我不这么认为。我搜索这个主题,但没有成功 - 然后我来这里发帖。
I read about Control Flow Functions here,但我仍然感到困惑。
提前致谢!
答案 0 :(得分:3)
因此,如果字段不为NULL,您希望获得与该谓词匹配的记录。这就像说如果字段为NULL则获取它们,否则过滤。只需将两个谓词与OR
组合:
AND (`categoryId` IS NULL OR `ca`.`Category_Id` = `categoryId`)
答案 1 :(得分:1)
合并怎么样?
WHERE `map`.`Product_State` = inOffer
AND `ca`.`Category_Id` = coalesce(categoryId,`ca`.`Category_Id`)
答案 2 :(得分:0)
WHERE ...
AND (ca.Category_Id = categoryId OR categoryId IS NULL)
...
或(仅限教育用途):
WHERE ...
AND IF(categoryId IS NULL, TRUE, ca.Category_Id = categoryId)
但不要这样做......
有关信息,您使用的表单是“Control Flow statement”,用于控制过程中的执行流程。我提出的表单(在第二个不可用的选项中)是“Control Flow function”(实质上是函数调用)。
第一种形式与所有命令式语言相同。第二个用于在SQL语句中使用。后者仅用于最后的手段,因为几乎总有更好的方法来编写查询。