我有这个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,还是在第一次匹配后停止评估后续案例?这实际上就是我需要的。
由于
答案 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。
中记录了这一点