SQL 和 ALL 运算符

标签 sql sql-server tsql

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

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!'

最佳答案

用途:

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!'

关于SQL 和 ALL 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3453236/

相关文章:

sql-server - 限制 SQL Server Management Studio 中更新/删除的行数

php - 如何使这种关系在 MYSQL 或 Laravel 中工作

java.sql.SQLException : Field 'id' doesn't have a default value 异常

mysql - 我需要什么样的 JOIN 或 WHERE 子句?

python - 如何序列化和反序列化 Django ORM 查询(不是查询集)?

c# - Entity Framework -使用存储过程急于加载对象图

sql-server-2005 - 是 T-SQL 存储过程执行 'atomic' 吗?

sql - Real * Bigint 不返回正确的值

sql - 在 select 语句中将日期时间列从 UTC 转换为本地时间

mysql - 在 MySQL 中选择对同一临时表的不同列的计数