Проверка различных значений на уровне столбца

#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 значения, а затем проверяет, что все остальные различны.