#sql #sql-server #tsql #sql-server-2008
#sql #sql-сервер #tsql #sql-server-2008
Вопрос:
У меня есть четыре столбца, исходящие из моего запроса. Мое требование — проверить, отличаются ли значения всех столбцов, а затем выбрать только результат.
Я написал этот запрос, и он работает нормально. Но мне просто интересно, есть ли какой-нибудь лучший или кратчайший способ добиться этого
select FO, AFO, CO, ACO from mytable
where
(fo<>afo or (fo is null or afo is null))
and
(fo<>co or (fo is null or co is null))
and
(fo<>aco or (fo is null or aco is null))
and
(afo<>co or (afo is null or co is null))
and
(afo<>aco or (afo is null or aco is null))
and
(co<>aco or (co is null or aco is null))
Комментарии:
1. Можете ли вы предоставить набор примеров данных, ваше описание ожидаемого результата немного сбивает с толку.
2. @PawanNogariya не могли бы вы загрузить некоторые образцы данных и выходных данных
3. С точки зрения ярлыка (и предполагая, что ваши столбцы имеют тип varchar) (fo<>afo или (fo равно нулю или afo равно нулю)) может быть записан как COALESCE(fo, ‘fo’) <> COALESCE(afo, ‘afo’)
4. @DimiTakis это не очень хорошая идея. Это приведет к принудительному полному сканированию таблицы, даже если в столбцах есть индексы
5. @PanagiotisKanavos Ну что ж, не согласен с этим — планы запросов идентичны для обоих — просто попробуйте на своей стороне, и вы увидите
Ответ №1:
Хммм . . . вы, кажется, хотите, чтобы четыре значения были разными или NULL
. Другой метод использует apply
:
select t.*
from mytable t cross apply
(select count(*)
from (values (t.afo), (t.fo), (t.co), (t.aco)
) v(val)
where val is not null
having count(*) = count(distinct val)
) x;
Это удаляет NULL
значения, а затем проверяет, что все остальные различны.