2017-03-09 75 views
4

我的SQL查询包含WHERE条款看起来像这样:如何在WHERE子句中使用两次相同的列表?

WHERE 
     name1 in ('Emily', 'Jack', 'James', 'Chloe') 
    OR name2 in ('Emily', 'Jack', 'James', 'Chloe') 

需要注意的是相同的列表出现了两次,这是相当不令人满意的(和我真正的名单实际上较长)。

什么是更好的方式来写这个查询?

+0

这将是更好的存储'name1'并在不同的行'name2'(另一个表)。 –

+0

当然会,但我没有设计数据库。我只有一个只读访问权限。 – Scarabee

回答

7

您可以使用数组和overlap operator &&,例如:

with my_table(name1, name2) as (
values ('Emily', 'Bob'), ('Ben', 'Jack'), ('Bob', 'Ben') 
) 

select * 
from my_table 
where array[name1, name2] && array['Emily', 'Jack', 'James', 'Chloe']; 

name1 | name2 
-------+------- 
Emily | Bob 
Ben | Jack 
(2 rows) 
4

使用公用表表达式:

with to_check (name) as (
    values ('Emily'), ('Jack'), ('James'), ('Chloe') 
) 
select ... 
from ... 
WHERE name1 in (select name from to_check) 
    OR name2 in (select name from to_check); 
-1

一种方法是正则表达式:

WHERE (name1 || ' ' || name2) ~ 'Emily|Jack|James|Chloe' 

这不正是相同的逻辑(命名为“艾米丽·多伊”将匹配该逻辑但不是第一个),但它可能会做你想做的。