SQL查询中的CASE WHEN语句示例

时间:2016-06-14 05:12:45

标签: sql postgresql

我的项目中有特殊的公司top_company值为false。

special_companies = [111, 222, 333];

我已经写了以下查询。

SELECT top_company FROM companies

和top_company将返回布尔输出。如果top_company返回false,现在出现问题,我想检查每个公司是否包含在special_companies中。如果包含yes,我想将该公司作为布尔值YES返回。如果不包括在内,则为布尔NO

2 个答案:

答案 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

SQL Fiddle

或者,如果您不需要字符串YES / NO输出,但纯布尔值:

select *,
       (id in (111,222,333) or top_company) as is_top_or_special
from   companies