【问题标题】:How does one use SELECT CASE within a Scalar Function?如何在标量函数中使用 SELECT CASE?
【发布时间】:2019-12-24 20:06:46
【问题描述】:

这是一个非常基本的标量函数,如果提供的 2 个数字的总和等于 10,则应返回 1,否则返回 0

CREATE FUNCTION IsSumEqualToTen
(
    @number1 INT,
    @number2 INT
)
RETURNS BIT
AS
    RETURN
    (
        SELECT CASE WHEN (@number1 + @number2) = 10
        THEN CAST(1 AS BIT)
        ELSE CAST(0 AS BIT)
        END
    )

但是,我得到了一个语法错误!

'RETURN' 附近的语法不正确。

这里有什么不正确的地方?

【问题讨论】:

  • RETURNS BIT 声明了一个多步标量函数。 as return 表示内联表值函数。选择一个或另一个。如果您通过使用returns table 并为所选列指定名称来选择内联表值,则性能会更好。否则,给函数一个带有begin...end 的主体,并在其中有一个return

标签: sql tsql sql-server-2014


【解决方案1】:

您不需要在函数体中使用SELECT。你可以简单地写:

CREATE FUNCTION IsSumEqualToTen (
    @number1 INT,
    @number2 INT
) RETURNS BIT
AS
BEGIN
    RETURN (CASE WHEN (@number1 + @number2) = 10 THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT) END);
END

【讨论】:

  • 不确定IN (10, 0) 的来源,但 OP 要求您对 IsSumEqualToTen 的期望:return case when @number1 + @number2 = 10 then 1 else 0 end;。正如 GSerg 和 Alan Burstein 所指出的,当函数返回类型声明为 bit 时,不需要 cast
  • @Habo 。 . .我不觉得是我编造的,但我不确定它是从哪里来的。我认为更重要的是不需要select
【解决方案2】:

你需要一个开始/结束

CREATE FUNCTION IsSumEqualToTen
(
    @number1 INT,
    @number2 INT
)
RETURNS BIT
AS
BEGIN
    RETURN
    (
        SELECT CASE WHEN (@number1 + @number2) IN (10,0)
        THEN CAST(1 AS BIT)
        ELSE CAST(0 AS BIT)
        END
    )
END
GO

还请注意,您不需要转换为 BIT,因为该函数会返回一个位。最后,标量函数像泥土一样缓慢。您可以改用内联函数,这需要一些额外的努力才能应用,但速度会快几倍。

CREATE FUNCTION dbo.IsSumEqualToTen
(
    @number1 INT,
    @number2 INT
)
RETURNS TABLE AS RETURN
SELECT is10 = CASE WHEN (@number1 + @number2) =IN (10,0) THEN CAST(1 AS BIT) ELSE 0 END;
GO

【讨论】:

  • 啊,我想知道为什么我在网上看到CREATE FUNCTION 的示例没有BEGINEND,只是认为它是单语句标量函数的简写。我实际上是想弄清楚为什么在标量函数中使用 CTE WITH 时会出现语法错误(即使使用 BEGINEND)。这至少消除了SELECT CASE 似乎是罪魁祸首的红鲱鱼。
猜你喜欢
  • 1970-01-01
  • 2012-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多