mysql - 如果查询未找到行,如何返回空值
问题描述
我正在使用 SQL Server 2017。我正在 Azure Data Studio 中将整个 MySQL Sakila 数据库创建到我的数据库中。我目前坚持使用功能,特别是以下行:
DECLARE EXIT HANDLER FOR NOT FOUND RETURN NULL;
这是我的尝试,没有我提到的那一行,查询似乎没有错误。
CREATE FUNCTION inventory_held_by_customer (@p_inventory_id INT)
RETURNS int
WITH EXECUTE AS CALLER
AS
BEGIN
DECLARE @v_customer_id INT;
DECLARE EXIT HANDLER FOR NOT FOUND RETURN NULL; ---if the query finds no rows at all, then return a null
SELECT @v_customer_id=customer_id
FROM rental
WHERE return_date IS NULL
AND inventory_id = @p_inventory_id;
RETURN(@v_customer_id);
END;
这是 MySQL 的原始查询
CREATE DEFINER=`root`@`localhost` FUNCTION `inventory_held_by_customer`(p_inventory_id INT) RETURNS int(11)
READS SQL DATA
BEGIN
DECLARE v_customer_id INT;
DECLARE EXIT HANDLER FOR NOT FOUND RETURN NULL;
SELECT customer_id INTO v_customer_id
FROM rental
WHERE return_date IS NULL
AND inventory_id = p_inventory_id;
RETURN v_customer_id;
END
在此先感谢,感谢您的帮助!
解决方案
首先,你不需要添加DECLARE EXIT HANDLER FOR NOT FOUND RETURN NULL;
到你的函数中,如果没有结果,它将返回 null 。
其次,标量函数很慢,因为它们在每一行的单独上下文中执行。相反,创建内联 TVF 的性能要高得多:
CREATE FUNCTION inventory_held_by_customer (@p_inventory_id INT)
RETURNS TABLE
AS RETURN
(
SELECT customer_id
FROM rental
WHERE return_date IS NULL
AND inventory_id = @p_inventory_id
);
GO
推荐阅读
- javascript - 如何在不影响行的情况下将此值舍入到小数点后 8 位
- css - 动态更改 CSS4 变量
- web - 有什么方法可以使文件实例为网站中的所有用户持久存在
- objective-c - 如何在 macOS 中搜索任何卷?
- node.js - 使用松露拆箱反应时出现松露拆箱错误
- python - 让用户将图片上传到我的 kivy 应用
- swift - 根据内容调整 UILabel 高度?
- ruby-on-rails - wkhtmltopdf_binary_gem:语法错误:单词意外(期望“)”)
- java - 如何将 jtextfield 添加到具有绘制组件的 jpanel?
- c++ - 如何将内存静态分配给指向结构的指针数组