SQL Server若存在则1,否则2。

87

使用 Sql Server 2012。我有一个存储过程,其中的一部分检查表格中是否存在用户名。如果存在,返回 1;如果不存在,返回 2。以下是我的代码:

IF EXISTS (SELECT * FROM tblGLUserAccess WHERE GLUserName ='xxxxxxxx') 1 else 2

然而,我一直收到以下错误:

“1”附近语法不正确。

使用IF EXIST是否可能出现这种情况?

敬礼,

迈克尔

6个回答

189

如果你想用这种方式来做,那么这就是你需要的语法;

IF EXISTS (SELECT * FROM tblGLUserAccess WHERE GLUserName ='xxxxxxxx') 
BEGIN
   SELECT 1 
END
ELSE
BEGIN
    SELECT 2
END

你不一定需要BEGIN..END语句,但最好从一开始就养成这个习惯。


26

使用IIF怎么样?

SELECT IIF (EXISTS (SELECT 1 FROM tblGLUserAccess WHERE GLUserName ='xxxxxxxx'), 1, 2)

此外,如果要使用EXISTS来检查行的存在性,请不要使用*,而是使用1。我认为这样成本最小。


10
在SQL Server中,使用"SELECT *"和使用"SELECT 1"或"SELECT 0"与EXISTS一起使用在性能上没有差别。这更多是个人偏好的问题。 - Doug Knudsen

8

最佳实践是始终使用TOP 1 1

如果我使用SELECT 1 -> 如果条件匹配多个记录,则您的查询将获取所有列记录并返回1。

如果我使用SELECT TOP 1 1 -> 即使条件匹配多个记录,它也仅会获取任何一行(具有自身值为1的列)的存在并返回1。

IF EXISTS (SELECT TOP 1 1 FROM tblGLUserAccess WHERE GLUserName ='xxxxxxxx') 
BEGIN
   SELECT 1 
END
ELSE
BEGIN
    SELECT 2
END

6
这绝对不是必要的 - 参见此问题 - Bill Tür stands with Ukraine
3
我仍然认为这是一个有效的查询。它完全基于WHERE条件。如果您的条件恰好匹配一条记录,那么没有问题。假设您的条件匹配更多的记录,则会产生成本。当我选择1时,它花费了计算标量成本:16%。 当我使用SELECT TOP 1 1时,计算标量成本为0%。因此,这取决于记录匹配的数量,会产生差异。 - Lakshmanan Dhamotharan

7

在SQL中,如果没有使用SELECT,则无法获得任何结果。我更喜欢使用CASE语句代替IF-ELSE块来实现这个功能。

SELECT CASE
         WHEN EXISTS (SELECT 1
                      FROM   tblGLUserAccess
                      WHERE  GLUserName = 'xxxxxxxx') THEN 1
         ELSE 2
       END 

5
您可以定义一个变量@Result,将数据填充到其中。
DECLARE @Result AS INT

IF EXISTS (SELECT * FROM tblGLUserAccess WHERE GLUserName ='xxxxxxxx') 
SET @Result = 1 
else
SET @Result = 2

4

您需要的输出是什么,是select还是print等等。

因此,请使用以下代码:

IF EXISTS (SELECT * FROM tblGLUserAccess WHERE GLUserName ='xxxxxxxx') select 1 else select 2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接