首页 > 解决方案 > 如果查询未找到行,如何返回空值

问题描述

我正在使用 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

在此先感谢,感谢您的帮助!

标签: mysqlsqlsql-servertsql

解决方案


首先,你不需要添加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

推荐阅读