Другое предложение:
DECLARE @tbl TABLE(ID INT IDENTITY,ColA VARCHAR(10),ColB VARCHAR(10),ColC VARCHAR(10),ColD VARCHAR(10),ColE VARCHAR(10));
INSERT INTO @tbl VALUES(NULL,NULL,NULL,'Y',NULL)
,(NULL,'Y',NULL,'Y',NULL)
,('Y','Y','','Y','')
,(NULL,NULL,NULL,NULL,NULL)
,(NULL,'',NULL,'Y',NULL)
,('Y','',NULL,'Y',NULL)
,('','',NULL,'Y',NULL);
SELECT *
,LEN(CONCAT(ColA,ColB,ColC,ColD,ColE)) CountOfY
FROM @tbl
Результат
1 NULL NULL NULL Y NULL Y 1
2 NULL Y NULL Y NULL YY 2
3 Y Y Y YYY 3
4 NULL NULL NULL NULL NULL 0
5 NULL NULL Y NULL Y 1
6 Y NULL Y NULL YY 2
7 NULL Y NULL Y 1
Это будет использовать CONCAT()
(v2012 +) для построения объединенной строки всех столбцов.Затем мы проверяем длину строки.Преимущество CONCAT
заключается в неявном обращении с приведением типов и значениями NULL.
Если в ваши столбцы могут входить значения, отличные от Y
или NULL
/ пустая строка , мы по-прежнемуМожно пойти по этому пути, но это, конечно, потребует некоторых адаптаций ...
Подсказка
Вы можете использовать это, чтобы получить набор всех строк и применить фильтры любого типа, или вы можете изменитьэто в WHERE
с LEN(...)>1