SQL-获取与表中未找到的字符串和字符串列表匹配的行的列值?
我有一个表,其中有一个“serialnumber”(VARCHAR(50))列和一个“active”(BOOLEAN)列。。。因此,数据样本可能如下所示:SQL-获取与表中未找到的字符串和字符串列表匹配的行的列值?,sql,postgresql,select,Sql,Postgresql,Select,我有一个表,其中有一个“serialnumber”(VARCHAR(50))列和一个“active”(BOOLEAN)列。。。因此,数据样本可能如下所示: serial | active -------------+------- ABCD232010E5 | True ABCD1820102C | False ABCD1820102C | True ZYXW06210F20 | True ABCD402004EZ | False 现在,从外部来源,我得到了一个序列号列表,如下所示
serial | active
-------------+-------
ABCD232010E5 | True
ABCD1820102C | False
ABCD1820102C | True
ZYXW06210F20 | True
ABCD402004EZ | False
现在,从外部来源,我得到了一个序列号列表,如下所示:
ABCD232010E5
ZYXW49201X20
ABCD1820102C
ABCD402004EZ
ZYXW012100R3
ABCD44200B1W
我是否可以运行单个(理想情况下)查询或一系列查询来获取以下详细信息:
- 序列号是否有
条目active=True
- 如果没有,是否有
条目active=False
- 如果它在表中根本不存在,则显式地将其列出来
- 将列出我输入的所有序列,无论它们是否存在
- 我输入的每个序列只列出一次,不管它在表中出现多少次
- 如果表中存在,是否至少有一个条目具有
active=True
如果输出只有两列,并且active=表示表中不存在的序列号,我也可以。正如我所说,我并不挑剔,我只需要能够区分这三种状态(exists and has active=True,exists and not has active=True,not exists)。一种方法是子查询:
select i.*,
(exists (select 1 from serials s where s.serial = i.serial and active
)) as has_active_true,
(exists (select 1 from serials s where s.serial = i.serial and not_active
)) as has_active_false,
(not exists (select 1 from serials s where s.serial = i.serial
)) as no_match
from input i;
通过将末尾的输入i
替换为以下内容,可以直接针对值列表运行此操作:
(VALUES
('serial1'),('serial2'),('serial3'),
('serial4'),('serial5'),('serial6')
) AS i (serial)
谢谢,这正是我想要的!子查询缺少第二个结束参数,因此我为此提交了一个编辑。它不允许我编辑,因为更改只有3个字符,所以我添加了如何查询值列表,因为这是我的特殊用例,我认为它可能也会帮助其他人。
(VALUES
('serial1'),('serial2'),('serial3'),
('serial4'),('serial5'),('serial6')
) AS i (serial)