Не в пункте postgresql - PullRequest
       3

Не в пункте postgresql

0 голосов
/ 06 ноября 2018

table1

  emp_id     Grade

   1     first_class
   2     Second_class
   3     first_class
   4     third_class

table2

emp_id     Grade

   1        A
   2        B
   3        A
   4        C

В таблице 2 у нас есть значения столбцов оценок, которые преобразованы

например

если first_class, то A

если Second_class, то B

если третий_класс, то C

Как написать запрос, подобный приведенному ниже

select * from table1 where
emp_id||Grade not in (select emp_id||Grade from table2);

приведенный выше запрос не работает, поскольку в одном из значений таблицы столбца Grade преобразуются значения.

Ответы [ 3 ]

0 голосов
/ 06 ноября 2018
select * 
from table1 
where  emp_id||Grade not in (select emp_id || CASE Grade 
                                              WHEN 'A' THEN 'first_class'
                                              WHEN 'B' THEN 'Second_class'
                                              WHEN 'C' THEN 'third_class'
                                              END
                             from table2);
0 голосов
/ 06 ноября 2018

Я бы использовал кортежи:

select t1.*
from t1
where (emp_id, grade) not in (select emp_id,
                                     (case Grade when 'first_class' then 'A'
                                                 when 'Second_class' then 'B'
                                                 when 'third_class' then 'C'
                                                 else ''
                                      end)
                              from table2
                             );

Обратите внимание, что NOT IN заставляет меня нервничать из-за того, как он работает со значениями NULL. По этой причине я включил пустую строку для ELSE.

Postgres поддерживает кортежи, поэтому нет необходимости в конкатенации.

0 голосов
/ 06 ноября 2018

Мне кажется, вы нашли что-то вроде ниже sql

 select * from table1 where
     concat(emp_id,
   case Grade when 'first_class' then 'A'
              when 'Second_class' then 'B'
               when 'third_class' then 'C' end) not in 
   (select concat(emp_id,Grade) from table2);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...