Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 从所选案例返回第一个匹配项_Sql Server - Fatal编程技术网

Sql server 从所选案例返回第一个匹配项

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

我有这个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,即使后续案例也为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