sql - 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,我只想要我给它的值的结果。
解决方案
您基本上想要创建一个包含您正在检查的输入数据的派生表,因为仅仅将您的结果限制为您正在搜索的 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
推荐阅读
- css - 尽管 CSS 偏移值相同,但差距很小
- c# - 为什么我的“运行时加载的图像”质量很差并且像素偏移?
- sql - SQL Server:对子查询进行 GROUP BY 后出现“无效的列名”错误
- python - TensorFlow/Keras:如何从 Keras 的应用程序模块中获取缺失的模型(ResNet101、ResNeXt 等)?
- php - 从其他三个表yii2插入数据到表中
- c# - iTextSharp 合并 PDF 而不保留页面大小
- apache-kafka - 是否支持 arangodb kafka 连接源连接器?
- python - Lambda 函数和过滤器 - Python 3
- python - 缺少必需的参数,类中的多处理
- azure - 在 Azure 中将资源从禁用移动到新订阅