从精选案例返回第一场比赛

时间:2014-09-03 19:51:04

标签: sql-server

我有这个MS-SQL功能:

ALTER FUNCTION [dbo].[fn_GetSource]
(
    @LandingPage varchar(MAX),
    @Referrer varchar(MAX)
)
RETURNS int
AS
BEGIN
DECLARE @Source int

SELECT @Source = 
CASE 
WHEN @LandingPage LIKE '%gclid%' THEN 1 
WHEN @LandingPage LIKE '%blahblahblah%' THEN 2 
ELSE 0
END

-- Return the result of the function
RETURN @Source

END

我的问题是,如果第一个案例返回true,即使后续案例也是真的,@ source会返回1,还是在第一次匹配后停止评估后续案例?这实际上就是我需要的。

由于

3 个答案:

答案 0 :(得分:2)

以下测试很容易证明这一点:

DECLARE @Source int
DECLARE @LandingPage varchar(50)

SET @LandingPage = '5gclidasdfblahblahblah'

SELECT @Source = CASE 
                    WHEN @LandingPage LIKE '%gclid%' THEN 1
                    WHEN @LandingPage LIKE '%blahblahblah%' THEN 2
                    ELSE 0 
                    END

PRINT @Source --1

如果我在@LandingPage内切换订单:

SET @LandingPage = '5blahblahblahasdfgclidasdf'

SELECT @Source = CASE 
                    WHEN @LandingPage LIKE '%gclid%' THEN 1
                    WHEN @LandingPage LIKE '%blahblahblah%' THEN 2
                    ELSE 0 
                    END

PRINT @Source --1

答案 1 :(得分:0)

SQL案例不像c / c ++那样需要中断;这种情况通常会在第一场比赛中进行。

e.g。

CREATE FUNCTION [dbo].[whatstoog]
(
    @Name varchar(MAX)
)
RETURNS int
AS
BEGIN
DECLARE @RetVal int

SELECT @RetVal = 
    CASE 
        WHEN @Name LIKE '%mo%' THEN 1 
        WHEN @Name LIKE '%lar%' THEN 2 
        WHEN @Name LIKE '%curly%' THEN 3 
    ELSE 0
END

RETURN @RetVal

END

同时,在查看您的示例时,您需要确保您的%通配符可以避免误报,例如:

如果你运行上面的例子:

SELECT dbo.whatstoog   SELECT dbo.whatstoog

结果分别为1和2,而

SELECT dbo.whatstoog也返回1,但你只想为moe返回1。

PS。 SQL Server支持LIKE的正则表达式,为更复杂的模式匹配提供了灵活性。

- 编辑

为准确起见,根据Aaron的评论,RegEx的LIKE支持不是RegEx的教科书版本,而是类似且(相对)有限的实现。

答案 2 :(得分:0)

感谢Michael McGriff的好解释。当检查不同的变量时,CASE也会在第一个true之后跳出。例如,我最近测试了这段代码:

SELECT sortStr  = case
            when @code = 'AA' then '111'
            when @code = 'BB' then '222'
            when @othercode = 'CCC' then 'BAW '
            else '    ' 
   END

使用@code =' BB'和@othercode =' CCC'我希望看到' BAW'但是它返回' 222'因为它在找到第一个真实后跳了出来。

Microsoft还在CASE Transact-SQL page

中记录了这一点