首页 > 解决方案 > SQL - 如果表中存在值,如何返回布尔值

问题描述

我有一堆值(包裹),我需要检查数据库以确保它们都已经存在。有时这些包裹有 100 个。我想基本上返回一个真值或假值,这样我就可以找出哪个不存在并处理那个特定的包裹。日期方面是我需要始终按前一年过滤。我对 SQL 很熟悉,所以我很感激你的帮助。

我试过这个:

SELECT *,
CASE WHEN EXISTS (SELECT * FROM Property WHERE taxyear = YEAR(GETDATE()) - 1 and (parcel in 
('1719309002000',
 '1024247013000',
 '1024247008000',
 '1024247001000'))
 THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT) END AS ExistsStatus
 FROM Property

SELECT Parcel, Powner, taxyear, 
CASE WHEN taxyear = YEAR(GETDATE()) - 1 and (parcel in 
('1719309002000',
 '1024247013000',
 '1024247008000',
 '1024247001000'
)) 
THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT) END AS result_field
FROM Property;

它只是遍历表中的每个包裹,放置 0 或 1,我只想要我给它的值的结果。

标签: sqlsql-server

解决方案


您基本上想要创建一个包含您正在检查的输入数据的派生表,因为仅仅将您的结果限制为您正在搜索的 ID 将永远无法给您一个错误的回报。不匹配的值不会有一行。

通过这样做,您将从一个包含您要查找的所有宗地号的表开始,然后左连接真实数据,这样您就不会在连接时丢失任何行。最后,CASE 语句检查连接是否成功连接了现有行。

您会注意到这个派生表是由一系列 UNION 语句创建的——本质上是将行重复粘贴在一起以创建一个内存表。您可以通过实际创建“临时表”来以不同的方式执行此操作,但我发现在没有任何中间处理的情况下,此方法稍微快一些。

SELECT InputTable.parcel, (CASE WHEN Property.parcel IS NOT NULL THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT) END) AS ExistsStatus
FROM (
  SELECT '1719309002000' AS parcel UNION
  SELECT '1024247013000' UNION
  SELECT '1024247008000' UNION
  SELECT '1024247001000'
) AS InputTable
LEFT JOIN Property ON Property.parcel = InputTable.parcel AND Property.taxyear = YEAR(GETDATE()) - 1

推荐阅读