У меня есть четыре столбца из моего запроса. Мое требование - проверить, отличаются ли значения всех столбцов, а затем выбрать только результат.
Я написал этот запрос, и он работает нормально. Но мне просто интересно, есть ли лучший или более быстрый способ добиться этого
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))
@PawanNogariya, не могли бы вы загрузить некоторые образцы данных и вывод
С точки зрения сокращения (и при условии, что ваши столбцы имеют тип varchar) (fo<>afo или (fo равно null или afo равно null)) можно записать как COALESCE(fo, 'fo') <> COALESCE(afo, ' афо')
@DimiTakis, это не очень хорошая идея. Это приведет к полному сканированию таблицы, даже если в столбцах есть индексы.
@PanagiotisKanavos Ну, не согласен с этим - планы запросов идентичны для обоих - просто попробуйте со своей стороны, и вы увидите
Хм . . . вы, кажется, хотите, чтобы четыре значения были разными или 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
, а затем проверяет, что все остальные различны.
Можете ли вы предоставить набор примеров данных, ваше описание ожидаемого результата немного сбивает с толку.