检查SQL Select语句是否返回零行

34

我有一个select语句

SELECT     QBalance
FROM         dbo.CustomerBalance
WHERE     (CustomerID = 1) AND (MarchentID = @MerchantId)
我想检查该语句是否返回0行。我尝试使用ISNULL和IFNULL,但似乎缺少了什么。

1
您所说的“Null”是指没有行,还是在QBalance中实际上是一个“Null”值?如果出现空值,您想要做什么? - Jamie F
为了帮助您以后的工作,"没有行"与"null"是不同的。(您应该编辑此问题,更改为"No Rows",并指定您想要发生的情况。) - Jamie F
1
好的,谢谢。我已经这样做了,它运行得很好。 DECLARE @NULL int SET @NULL= (SELECT COUNT(QBalance) FROM dbo.CustomerBalance WHERE (CustomerID = @CustomerID) AND (MarchentID = @MerchantId)) IF @NULL=0 BEGIN INSERT INTO [CustomerBalance]([CustomerID],[MarchentID],[QBalance],[InitialDate]) VALUES(@CustomerID,@MerchantId,@CodeQPoints,GETDATE()) END ELSE UPDATE [CustomerBalance] SET QBalance=@CodeQPoints+QBalance,InitialDate=GETDATE() WHERE dbo.CustomerBalance.CustomerID=@CustomerID and dbo.CustomerBalance.MarchentID=@MerchantId - Islam
6个回答

68

要查找是否存在不匹配的行,可以使用 NOT EXISTS。这比计算所有匹配行更有效率。

IF NOT EXISTS(SELECT * FROM ...)
BEGIN
PRINT 'No matching row exists'
END

14

如果这是SQL Server,请尝试使用@@ROWCOUNT


9
SELECT    COUNT(*) 
FROM         dbo.CustomerBalance 
WHERE     (CustomerID = 1) AND (MarchentID = @MerchantId) 

如果你得到0,那么你就得到了0。 :)

有没有更有效的方法来做到这一点? - Nisarg Patil
查看已接受的答案,或者查看您的索引策略。 - Stuart Ainsworth

6
你可以使用@@ROWCOUNT。例如:
SELECT     QBalance
FROM         dbo.CustomerBalance
WHERE     (CustomerID = 1) AND (MarchentID = @MerchantId)

--This will return no of rows returned by above statement.
SELECT @@ROWCOUNT

如果第一个语句没有返回任何行,您将得到0。您还可以使用if语句来检查第一个语句后面的内容。例如:
IF @@ROWCOUNT <> 0 
  PRINT 'Select statement is returning some rows'
ELSE 
  PRINT 'No rows returned' 

2

尝试这个:

SELECT     ISNULL(QBalance, 'ReplaceValue')
FROM         dbo.CustomerBalance
WHERE     (CustomerID = 1) AND (MarchentID = @MerchantId)

非常简单,非常好。 - Jordan_Walters
7
@Jordan_Walters - 这并不起作用。如果不存在任何行,则没有值可应用“ISNULL”。 - Martin Smith

0

也可以使用外部的ISNULL检查吗?

SELECT ISNULL((
SELECT QBalance
FROM   dbo.CustomerBalance
WHERE  (CustomerID = 1) AND (MarchentID = @MerchantId)), 0)

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