繁体   English   中英

CASE WHEN 中的 COUNT 导致 Invalid Column 错误

[英]COUNT inside CASE WHEN is causing Invalid Column error

select case 
         when COUNT(*)>0 THEN (select TOP 1 A.a1)
         else 'none'
       end
from A
where A.a1 > 10
order by A.a1

上面的代码导致以下错误:

列 'A.a1' 在 select 列表中无效,因为它不包含在聚合 function 或 GROUP BY 子句中。

我不明白为什么。

我的意图如下:如果存在 A.a1 大于 10 的行,则对它们进行排序并取顶部行的 a1 值。 如果没有这样的行,select 'none'。

编辑:这是将在子查询中使用的实际代码的简化版本。 所以,我不能使用 IF..ELSE 语句。

您有一个聚合查询,因为您有count(*) 这些对于子查询很棘手。 相反,您可以使用:

select (case when count(*) > 0 then A1.a1 else 'none'
        end)
from A left join
     (select top 1 A.a1) A1
     on 1 = 1
where A1.a1 > 10

这个逻辑有点不合情理。 我假设您的实际查询更有用。

RE:列 'A.a1' 在 select 列表中无效,因为它不包含在聚合 function 或 GROUP BY 子句中。

COUNT(*) 是一个聚合。 SQL 服务器希望所有列都在 GROUP BY 中。

RE:如果存在 A.a1 大于 10 的行,则对它们进行排序并取顶部行的 a1 值。 如果没有这样的行,select 'none'。 RE:编辑:这是将在子查询中使用的实际代码的简化版本。 所以,我不能使用 IF..ELSE 语句。

  • 按 a1 值排序并取 TOP 1 == MAX(a1)。
  • 假设 a1 是 int orfloat,则必须将值转换为 varchar 以处理“无”output。 LOWER 有效,并且比 CAST 或 CONVERT 需要更少的输入。

代码:

SELECT ISNULL(LOWER(MAX(a1)), 'none') FROM A WHERE A.a1 > 10

我建议您尝试使用UNION ALL来解决您的问题。 下面的代码供您参考。

DECLARE @T TABLE(ID INT,NAME VARCHAR(200))

INSERT INTO @T VALUES(11,'HAI')
INSERT INTO @T VALUES(12,'H')

SELECT * FROM @T

DECLARE @VAL INT=10

SELECT TOP 1 T.NAME
FROM @T T
WHERE T.ID>@VAL
UNION ALL
SELECT 'None'
WHERE NOT EXISTS (SELECT TOP 1 ID FROM @T WHERE ID>@VAL)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM