检索具有给定列表中不存在的列值的行

时间:2019-07-08 18:25:40

标签: postgresql

假设我有一个值列表

'A', 'B', 'C','D','E',...,'X'.

我有一个数据库列CHARS,其中存储着'C''E'之外的列表的确切值(一个值/行)。因此,CHARS包含'A', 'B', 'D',..., 'X'

PostgreSQL中是否有一种方法只返回'C''E'的行;我的列表中CHARS列中缺少的值?

2 个答案:

答案 0 :(得分:1)

如果您的值列表来自数据库外部(例如程序),则最简单的解决方案应该是NOT IN运算符

SELECT * FROM your_table WHERE chars NOT IN ('A', 'B', 'C', 'D', 'E', ..., 'X')

(注意:元组中缺少的字符不能用...缩写。因此,您已经全部写了。)

如果您的值列表来自表或查询,则可以使用子查询:

SELECT * FROM your_table WHERE chars NOT IN (SELECT a_char FROM another_table WHERE ...);

答案 1 :(得分:1)

您可以对values子句进行外部联接:

select i.ch as missing_character
from ( 
  values 
     ('A'), ('B'), ('C'), ('D'), ('E'), ('F'), ..., ('X')
) as i(ch)
  left join the_table t on i.ch = t.chars
where t.chars is null
order by i.ch;

请注意,每个字符都必须放在values子句的括号中,以确保每个字符都是一行。

或者,您可以使用EXCEPT运算符:

select ch
from ( 
  values ('A'), ('B'), ('C'), ('D'), ('E'), ('F'), ... , ('X') 
) as i(ch)

except 

select chars
from the_table
order by ch

在线示例:https://rextester.com/XOUB52627