【问题标题】:How to return a null if the query doesn't find a row如果查询未找到行,如何返回空值
【发布时间】:2021-08-04 04:00:55
【问题描述】:

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

提前致谢,感谢您的帮助!

【问题讨论】:

  • 在 SQL Server 中,如果没有找到结果,将自动返回 null。但是,您有一个缺陷,您返回的是从表中选择的单个标量值。但是,如果select 返回多行怎么办?您将返回 1 个随机值。
  • 非常感谢 Dale 告诉我查询存在缺陷。如果我返回一个表而不是一个 INT,那会解决吗?再次感谢!
  • 只有您知道该函数试图实现什么以及如何使用它。您希望返回单个值吗?还是值表?
  • @Stu OP 正在尝试从 MySQL 转换为 SQL Server。
  • 你打算如何使用函数的输出?一个表值函数似乎更合适,即返回一个符合条件的 ID 列表?

标签: mysql sql sql-server tsql


【解决方案1】:

首先,你不需要在你的函数中添加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

【讨论】:

  • 哇,非常感谢您的建议和信息!该功能看起来也更干净。在 Dale 评论之后,我尝试使用 RETURNS TABLE 但没有成功,但你帮助我查明了我犯错的地方。非常感谢,非常感谢!
  • @Kaelan - 注意:这是 SQL-Server 版本。你还需要 MySQL 吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-25
  • 2018-04-11
  • 1970-01-01
  • 2015-02-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多