我的项目中有特殊的公司top_company
值为false。
special_companies = [111, 222, 333];
我已经写了以下查询。
SELECT top_company FROM companies
和top_company将返回布尔输出。如果top_company
返回false,现在出现问题,我想检查每个公司是否包含在special_companies
中。如果包含yes,我想将该公司作为布尔值YES
返回。如果不包括在内,则为布尔NO
。
答案 0 :(得分:2)
感谢您的反馈,伙计们。另外,男孩,我累了。 xD需要去睡觉。另外,我搞砸了隐含的转换。 xD' 111'如果列类型不是字符串(VARCHAR或其他),则与111不同。 SQL SERVER将可能转换您的整个列以比较值。
SQL Server使用基于集合的逻辑,因此您可以比较CASE语句中的不同列以返回所需的正确值。根据你需要返回不在列表中的公司的名称(我的猜测不是?),你甚至可以使用谓词只返回那些假的值,然后比较列表。
此外,在SQL中,您可以使用内部联接和/或子查询来进一步限制结果,以忽略您不关心的公司。 E.G。
SELECT CASE WHEN A.top_companies = FALSE THEN 'YES' ELSE 'NO' END AS [COLUMN_NAME]
, B.special_companies
FROM TABLEA AS A
INNER JOIN (SELECT special_companies
FROM TABLEB
WHERE special_companies IN (111, 222, 333) ) AS B ON B.SOMEKEY = A.SOMEKEY
然而,我对你的special_companies = 111,222,333的猜测是它在同一张桌子里。因此,使用谓词来过滤列表,这不仅更快,而且如果列表通过索引变大,可能会提高性能。
否则,您的查询将在整个表上使用INDEX_SCAN,在表格变大时向下拖动效果。最佳做法是仅返回您想要查看的结果,因此使用谓词来限制数据集。
答案 1 :(得分:0)
当公司位于特殊列表中时,您似乎想要覆盖top_company
值:
select *,
case when id in (111,222,333) or top_company
then 'YES'
else 'NO'
end as is_top_or_special
from companies
或者,如果您不需要字符串YES
/ NO
输出,但纯布尔值:
select *,
(id in (111,222,333) or top_company) as is_top_or_special
from companies