Sql server 从所选案例返回第一个匹配项
我有这个MS-SQL函数:Sql server 从所选案例返回第一个匹配项,sql-server,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 '%blahbl
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,即使后续案例也为true,还是会在第一次匹配后停止评估后续案例?这正是我需要的
谢谢SQL案例不像c/c++那样需要休息;这种情况通常会在第一场比赛中发生 e、 g 同时,查看您的样本,您希望确保您的%通配符为,以避免误报,例如: 如果运行上述示例: 选择dbo.whatstoog 选择dbo.whatstoog 结果分别为1和2,而 选择dbo.whatstoog也会返回1,尽管您只打算为moe返回1 SQL Server支持正则表达式,这为更复杂的模式匹配提供了灵活性 --编辑
为了准确起见,根据Aaron的评论,RegEx的类似支持不是RegEx的教科书版本,而是一个类似且(相对)有限的实现。以下测试很容易证明这一点:
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
谢谢迈克尔·麦格里夫的解释。当检查不同的变量时,在第一个true之后,CASE也会跳出。例如,我最近测试了以下代码:
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',因为它在找到第一个true后跳出
Microsoft也在其文档中记录了这一点。是,它将停止对第一个真实案例的评估。它基本上是一个更干净的
if…else if…else
风格语句。在您的情况下,它会更干净。有些例外情况下,它会对以后的案例进行评估。它不会在以后返回匹配案例,但结果就是你真正想问的。是的,只要你没有聚合,它在找到匹配后就会短路。你难道不能简单地测试一下吗<代码>选择1=1时的大小写,然后选择2=2时的大小写,然后选择2结束@samyi。这只会证明,至少在某些情况下,它会返回第一个匹配的案例。并不是说它总是这样,而且也有保证。这篇博文举了一个例子,说明这种特殊的实验失败了<代码>大小写的行为是一致的。我不一定同意“SQL Server支持类似的正则表达式”-有一些表达式可以像正则表达式一样使用,但它们不是正则表达式。要在SQL Server中获取正则表达式,您需要直接使用CLR(您自己的程序集或函数)或间接使用CLR(例如,我认为MDS附带了一些隐藏使用CLR的正则表达式函数)。
SELECT sortStr = case
when @code = 'AA' then '111'
when @code = 'BB' then '222'
when @othercode = 'CCC' then 'BAW '
else ' '
END