SQL和ALL运算符

4

寻找一种优雅的方式来解决这个问题...

DECLARE @ZIP INT
SET @ZIP = 55555

IF @ZIP = ALL(SELECT ZIP FROM PEOPLE WHERE PERSONTYPE = 1) 
  PRINT 'All people of type 1 have the same zip!'
ELSE
  PRINT 'Not All people of type 1 have the same zip!'

问题在于,如果(SELECT ZIP FROM PEOPLE WHERE PERSONTYPE = 1)没有返回任何记录,那么上述IF语句将被评估为true。我正在寻找一种方法,在ALL子查询没有返回记录时,使其评估为false。
我的当前解决方案:
DECLARE @ZIP INT
SET @ZIP = 55555

DECLARE @ALLZIPS TABLE (INT ZIP)

INSERT INTO @ALLZIPS
SELECT ZIP FROM PEOPLE WHERE PERSONTYPE = 1

IF EXISTS(SELECT TOP 1 * FROM @ALLZIPS) AND (@ZIP = ALL (SELECT ZIP FROM @ALLZIPS))
  PRINT 'All people of type 1 have the same zip!'
ELSE
  PRINT 'Not All people of type 1 have the same zip!'

MS SQL Server(T-SQL标准) - MooseCoder
3个回答

3

使用:

IF EXISTS(SELECT NULL
            FROM PEOPLE p
           WHERE p.persontype = 1
          HAVING MIN(p.zip) = @Zip
             AND MAX(p.zip) = @Zip) 
  PRINT 'All people of type 1 have the same zip!'
ELSE
  PRINT 'Not All people of type 1 have the same zip!'

我喜欢ALL关键字,它真正强调了我想要做的事情。这不是一个坏主意。但只适用于INT。 - MooseCoder

2
考虑同时使用EXISTS。
IF @ZIP = ALL(SELECT ZIP FROM PEOPLE WHERE PERSONTYPE = 1)  
   AND EXISTS(SELECT 1 FROM PEOPLE WHERE PERSONTYPE = 1)

当你的查询只有一行时,看起来很不错,但如果选择的内容较多且涉及多个连接,则效果就不太好了。不过还不错。 - MooseCoder
的确,在具有多个连接的更大的选择语句的情况下,我会将其转换为公共表达式(CTE)。 - p.campbell

2

进入主题:

IF (SELECT SUM(CASE WHEN ZIP = @ZIP THEN 0 ELSE 1 END) 
    FROM PEOPLE WHERE PERSONTYPE = 1) = 0 
  PRINT 'All people of type 1 have the same zip!'
ELSE 
  PRINT 'Not All people of type 1 have the same zip!' 

我喜欢这个想法。让我困扰的是,为什么 ALL 关键字在空集合时不按照预期工作。这使它对许多用例变得无用。我希望保持使用它以提高可读性。 - MooseCoder
我在我的实际案例中实现了你的代码,所以你可以拿到支票。谢谢! - MooseCoder

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