Как знать, имеют ли все ячейки то же значение в некотором столбце (измененный заголовок)
Я хочу иметь немного скалярную величину, которая говорит мне, если все значения в столбце равняются чему-то:
DECLARE @bit bit
SELECT @bit = TRUEFORALL(Name IS NOT NULL) FROM Contact
ОБНОВЛЕНИЕ
Я теперь понял, что мне на самом деле не нужен TrueForAll, в чем я действительно нуждаюсь, должен удостовериться, что все значения в столбце равны, например, я хочу знать ли вся Группа. Объекты имеют одну цену.
Для вашего обновленного требования что-то подобное будет выглядеть так, как вы хотите:
DECLARE @IsSameGroup bit
SELECT @IsSameGroup = CASE WHEN COUNT(*) > 1 THEN 0 ELSE 1 END
FROM (SELECT Name FROM Contact GROUP BY Name) groups
Когда счетчик больше 1, у вас два разных имени (или цены в зависимости от того, на что вы группируете)
.Почему бы и нет?
select count( distinct price) from table
Если возвращается 1, то все значения одинаковы... Добавьте
, где цена не является нулевой
, если нужно
.Не очень хорошо для NULL, но 2008 может сделать:
SELECT 1 WHERE 'Blue' = ALL ( SELECT Color FROM dbo.Hat )
Или
DECLARE @bit bit
SET @bit =
CASE ( SELECT 1 WHERE 'Blue' = ALL ( SELECT Color FROM dbo.Hat ))
WHEN 1 THEN 1 ELSE 0 END
UPDATE
Все того же цвета
SET @bit =
CASE(
SELECT 1 WHERE
(SELECT TOP(1) Color FROM dbo.Hat) = ALL ( SELECT Color FROM dbo.Hat )
)
WHEN 1 THEN 1 ELSE 0 END
Может быть, это?
DECLARE @bit bit
if exists(SELECT Name FROM Contact WHERE Name IS NULL)
SET @bit = 0
ELSE
SET @bit = 1
Это решает ваш первый вопрос:
SELECT
CASE
WHEN EXISTS(
SELECT 1
FROM Contact
WHERE Name IS NULL
) THEN 0
ELSE 1
END
ADDED:
Это решит ваш второй:
SELECT
CASE
WHEN EXISTS(
SELECT TOP 1 1 FROM (
SELECT
ItemGroupName,
COUNT(Price) AS CNT
FROM ItemGroup
GROUP BY ItemGroupName
HAVING COUNT(Price) > 1
) t
) THEN 0
ELSE 1
END
Кстати, когда вы используете существующую функцию, лучше выбрать 1 (константу), чтобы меньше данных возвращалось
.