我需要选择具有特定ID IF 的总行数,它等于表格中的总最大行数。
我在这个例子中使用变量,但我想只用一个选择语句
DECLARE @a int, @b int
--total with special field (redcar = yes)
SELECT @a = (SELECT COUNT(*) FROM dbo.car WHERE redcar = 'yes')
-- max total of table
SELECT @b = (SELECT COUNT(*) FROM dbo.car)
IF(@a = @b)
BEGIN
SELECT @a
END
实施例 dbo.car
id redcar
1 yes
2
3 yes
4
5
6
输出应为0,因为红色汽车不等于表的总行数
答案 0 :(得分:4)
我能想到的最快方式:
SELECT COUNT(*)
FROM dbo.car
WHERE NOT EXISTS (SELECT 1 FROM dbo.CAR where COALESCE(redcar, '') <> 'yes')
由于你想要返回所有行,这只是检查是否有任何行不符合你的条件,如果是,它应该返回0或什么都没有。
答案 1 :(得分:3)
这应该可以解决问题:
SELECT ISNULL(b.numrows, 0) as numrows
FROM (
SELECT COUNT(*) AS numrows FROM car
) a
LEFT JOIN (
SELECT COUNT(*) AS numrows FROM car WHERE redcar = 'yes'
) b ON b.numrows = a.numrows
答案 2 :(得分:2)
如果匹配的行数与总行数不同,您可以使用case
返回0
:
SELECT case when count(*) = (select count(*) from dbo.car) then count(*)
else 0
end
FROM dbo.car
WHERE redcar = 'yes'
如果不满足条件,这将返回0
行。 if
语句根本不会返回任何行集。您可能需要调整客户端代码以解决此问题。
答案 3 :(得分:2)
我认为你可以这样做:
SELECT count(*)
FROM dbo.car
HAVING count(*) = sum (Case When redcar = 'yes' Then 1 Else 0 End)
或者这个:
SELECT allcars
FROM (SELECT COUNT(*) redcars FROM dbo.car WHERE redcar = 'yes') as redcars
cross join (SELECT COUNT(*) allcars FROM dbo.car) as allcars
WHERE redcars = allcars
但为什么你想要一个查询?使用像代码这样的变量更容易阅读。