不在条款postgresql

时间:2018-11-06 19:26:59

标签: sql postgresql

表1

  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

如果是Secondclass,那么B

如果是Third_class,则为C

如何编写与下面类似的查询

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

上面的查询不起作用,因为“成绩”列值在表之一中被转换。

3 个答案:

答案 0 :(得分:0)

在我看来,您发现类似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);

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我会使用元组:

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支持元组,因此不需要串联。