【问题标题】:SQL and ALL operatorSQL 和 ALL 运算符
【发布时间】:2010-08-10 20:40:05
【问题描述】:

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

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 标准)

标签: sql sql-server tsql


【解决方案1】:

用途:

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。
【解决方案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 关键字不能像预期的那样使用空集。 Kinda 使它对许多用例毫无用处。为了便于阅读,我想继续使用它。
  • 在我的真实案例中实现了您的代码,以便您获得支票。谢谢!
【解决方案3】:

考虑使用 EXISTS。

IF @ZIP = ALL(SELECT ZIP FROM PEOPLE WHERE PERSONTYPE = 1)  
   AND EXISTS(SELECT 1 FROM PEOPLE WHERE PERSONTYPE = 1)

【讨论】:

  • 当您的查询是单行查询时看起来不错,但是如果选择较大且有多个连接,那么就不是那么多了。不过还不错。
  • 确实,对于具有多连接的较大选择语句,我会将其设为 CTE。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多