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

У меня есть четыре столбца из моего запроса. Мое требование - проверить, отличаются ли значения всех столбцов, а затем выбрать только результат.

Я написал этот запрос, и он работает нормально. Но мне просто интересно, есть ли лучший или более быстрый способ добиться этого

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))

Можете ли вы предоставить набор примеров данных, ваше описание ожидаемого результата немного сбивает с толку.

haag1 08.04.2019 15:45

@PawanNogariya, не могли бы вы загрузить некоторые образцы данных и вывод

Hasan Mahmood 08.04.2019 15:46

С точки зрения сокращения (и при условии, что ваши столбцы имеют тип varchar) (fo<>afo или (fo равно null или afo равно null)) можно записать как COALESCE(fo, 'fo') <> COALESCE(afo, ' афо')

Dimi Takis 08.04.2019 15:48

@DimiTakis, это не очень хорошая идея. Это приведет к полному сканированию таблицы, даже если в столбцах есть индексы.

Panagiotis Kanavos 08.04.2019 15:49

@PanagiotisKanavos Ну, не согласен с этим - планы запросов идентичны для обоих - просто попробуйте со своей стороны, и вы увидите

Dimi Takis 08.04.2019 16:15
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
5
77
1
Перейти к ответу Данный вопрос помечен как решенный

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

Другие вопросы по теме